Git的基本使用

来源:互联网 发布:云视通监控软件下载 编辑:程序博客网 时间:2024/05/18 01:01

参考廖雪峰的git教程

git基本命令

账户设置

git config --global user.name "Your Name"git config --global user.email "email@example.com"

创建版本库

mkdir repositorynamecd repositorynamegit init

版本库添加文件

git add test.txt test2.txt ...git commit -m "comment"

查看当前仓库文件的状态

git status #查看文件修改信息git diff #查看具体被修改的内容

版本回退

git log #显示从最近到最远的提交日志

注意,这里的commit idcommit a0869b995443875315c2e53cd73a3694df27f294不是自己commit的id,这样做是为了防止冲突

HEAD 表示当前版本,HEAD^上一个版本,HEAD^^ 上上一个版本,以此类推。
HEAD~2 == HEAD^^

git reset --hard HEAD^git reset --hard commitID(不需要完整填写)

查看commitID

git reflog

缓存区与工作区

Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,
当执行git commit时,将暂存区的更改提交到工作区。

修改之后,直接git commit是不会把修改提交到工作区的,也就是说,每次修改,如果不add到暂存区,那就不会加入到commit中。

插销修改

git checkout -- file

命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

删除文件

两种情况:

如果在文件管理器中删除了,这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了。

 rm test.txt
  1. 确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
  2. 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
git checkout -- test.txt

远程仓库操作

远程仓库

  1. 可以自己搭建一个git 服务器
  2. 可以使用github免费的远程的仓库

关于github:传输使用的是SSH加密的。

  1. 创建ssh key
ssh-keygen -t rsa -C "youremail@example.com"
  1. 登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
  2. 在github 创建仓库
  3. 关联远程库
git remote add origin git@github.com:adamweixuan/repositoryname.git
  1. 推送master分支的所有内容
git push -u origin master
  1. 每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
git push origin master

克隆远程仓库

git clone git@github.com:adamweixuan/repositoryname.git

分支管理

分支概述

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

创建分支

图片来源 廖雪峰的官方博客

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长.

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

实际操作

创建分支:

$ git checkout -b devM       test.txtSwitched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令

git branch devgit checkout dev

查看分支:
git branch命令会列出所有分支,当前分支前面会标一个*号

$ git branch* dev  master

在分支上修改并提交:

切换到master分支:

$ git checkout masterSwitched to branch 'master'

切换回master分支后,再查看一个test.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

合并分支:

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

$ git merge devUpdating 5886d8d..cb3e4e9Fast-forward test.txt | 4 ++++ 1 file changed, 4 insertions(+)
$ cat test.txtThis is a test file to git !This is a another line !second changeCreating a new branch is quick

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

删除分支:

$ git branch -d devDeleted branch dev (was cb3e4e9).

再次查看,只剩下master了

$ git branch* master

解决冲突

  • 创建新的分支feature1
$ git checkout -b feature1Switched to a new branch 'feature1'
  • 分支修改
修改最后一行为Creating a new branch is quick & simple!$ git add test.txt
  • 分支提交
$ git commit -m "& simple"[feature1 0a8265e] & simple 1 file changed, 1 insertion(+), 1 deletion(-)
  • 切换到master分支
$ git checkout masterSwitched to branch 'master'
  • 在master上修改
在master分支上把test.txt文件的最后一行改为:Creating a new branch is quick and simple !
  • 在master上提交
$ git add test.txt$ git commit -m "and simple"[master 5de8d2c] and simple 1 file changed, 1 insertion(+), 1 deletion(-)
  • 现在的情况

  • 执行合并
$ git merge feature1Auto-merging test.txtCONFLICT (content): Merge conflict in test.txtAutomatic merge failed; fix conflicts and then commit the result.

出现了冲突

$ git statusOn branch masterYou have unmerged paths.  (fix conflicts and run "git commit")Unmerged paths:  (use "git add <file>..." to mark resolution)        both modified:   test.txtno changes added to commit (use "git add" and/or "git commit -a")
  • 手动合并
    查看test.txt
$ cat test.txtThis is a test file to git !This is a another line !second change<<<<<<< HEADCreating a new branch is quick and simple !=======Creating a new branch is quick & simple!>>>>>>> feature1

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存

Creating a new branch is quick and simple !
  • 重新提交

    $ git add test.txt$ git commit -m "conflict fixed"[master 4d854ab] conflict fixed
  • 查看分支合并情况
$ git log --graph --pretty=oneline --abbrev-commit*   4d854ab conflict fixed|\| * 0a8265e & simple* | 5de8d2c and simple|/* cb3e4e9 branch test* 5886d8d first commit* e5d5abd Test file
  • 删除feature1分支
$ git branch -d feature1Deleted branch feature1 (was 0a8265e).

分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

创建分支和之前相同,只是在准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward

git merge --no-ff -m "merge with no-ff" dev

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活

干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

Bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

git stash

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支

最后,恢复工作现场

查看工作现场:

git stash list

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了

Feature分支

首先创建了一个分支,做了一些更改。在提交之前,因为各种原因不想提交合并了。

删除这个分支

git branch -d feature-vulcan

会报错,说没有合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令 强制删除

git branch -D feature-vulcan

标签

发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照

创建标签

首先,切换到需要打标签的分支上

$ git checkout -b decSwitched to a new branch 'dec'

然后,敲命令git tag 就可以打一个新标签

git tag <name>$ git tag v1.0

可以用命令git tag查看所有标签

$ git tagv1.0

可以用git show 查看标签信息

$ git show v1.0commit 4d854abf006a3658893a091712196d5f3fefc7d5Merge: 5de8d2c 0a8265eAuthor: adamweixuan <805366180@qq.com>Date:   Mon Aug 31 13:30:08 2015 +0800    conflict fixeddiff --cc test.txtindex ccdc542,3cd9799..cbf9c25--- a/test.txt+++ b/test.txt@@@ -4,4 -4,4 +4,8 @@@ This is a another line  second change -Creating a new branch is quick & simple!++<<<<<<< HEAD +Creating a new branch is quick and simple !++=======++Creating a new branch is quick and simple !++>>>>>>> feature1

可以创建带有说明的标签,用-a指定标签名,-m指定说明文字

git tag -a v0.1 -m "version 0.1 released" 3628164

删除本地标签

$ git tag -d v1.0Deleted tag 'v1.0' (was 4d854ab)

如果要推送某个标签到远程,使用命令git push origin

git push origin V1.0

或者,一次性推送全部尚未推送到远程的本地标签

git push origin --tags

删除远程标签:

先从本地删除,

 git tag -d v1.0

然后,从远程删除。删除命令也是push,但是格式如下:

git push origin :refs/tags/v1.0

自定义git

设置显示颜色

git config --global color.ui true

配置别名

status 别名为st

git config --global alias.st status
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩上幼儿园反复感冒怎么办 3岁宝宝感冒鼻炎怎么办 鼻炎犯了鼻子不通气怎么办 食物呛到鼻子里怎么办 胃疼引起的焦虑怎么办 泰迪犬发生口腔亏痒怎么办? 俩鼻子都堵了怎么办 2岁宝宝鼻甲肿大怎么办 感冒10多天不好怎么办 宝妈鼻炎犯了怎么办 鼻炎犯了好多黄鼻涕怎么办 空调吹多了上火怎么办 宝宝感冒鼻塞流鼻涕口臭怎么办 怀孕了有鼻息肉怎么办 孕晚期鼻炎犯了怎么办 孕妇鼻炎犯了头疼怎么办 一岁宝宝有鼻炎怎么办 蒸馒头的面酸了怎么办 dnf点券充错账号了怎么办 英雄联盟点券充错区了怎么办 文玩鼻烟壶盖子松了怎么办 文胸磨腋下的肉怎么办 荷兰在窝里拉屎怎么办 宝宝把泡沫吃了怎么办 荷兰猪一直叫该怎么办 人吃了缓冲泡沫怎么办 不小心吃了泡沫怎么办 不想养荷兰猪了怎么办 刚买的乌龟死了怎么办 剪猫指甲出血了怎么办 猫吃了酸性植物怎么办 金鱼在缸底不动怎么办 野兔子不吃不喝怎么办 让荷兰猪咬了怎么办 仓鼠的脚被棉花怎么办 仓鼠的脚变黑了怎么办 夏天小仓鼠生了怎么办 把仓鼠摔出血了怎么办 仓鼠摔成骨折了怎么办 孩子被仓鼠咬了怎么办 仓鼠不咬磨牙石怎么办