Github学习(四)

参考文献


当然是廖雪峰老师的官网啦https://www.liaoxuefeng.com

很实用的网站

在本篇中主要介绍分支管理,全是根据廖雪峰老师的网站来搞的,仅供学习啦。

 

介绍


 

分支管理是为了方便团队协作,提高工作效率。

 

创建&合并分支


 

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

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

 

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

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

# 在dev上的工作完成了,就可以把dev合并到master上。直接把master指向dev的当前提交,就完成了合并:

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

 

STEP 1 创建dev 分支,然后切换到dev分支上:

# git checkout -b dev
M    readme.txt
切换到一个新分支 'dev'

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

# git branch命令查看当前分支

# git branch

* dev
  master

STEP 2 修改

# 然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating a new branch is quick.

STEP 3 提交

# git commit -m "branch test"
[dev 5332ab5] branch test
 2 files changed, 3 insertions(+)
 create mode 100644 text.txt

STEP 4 切换回master分支

# git checkout master
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。

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

STEP 5 把dev分支的工作成果合并到master分支上

#  git merge dev
更新 e7c1227..5332ab5
Fast-forward
 readme.txt | 3 +++
 text.txt   | 0
 2 files changed, 3 insertions(+)
 create mode 100644 text.txt

STEP 6 删除dev 分支

#  git merge dev
更新 e7c1227..5332ab5
Fast-forward
 readme.txt | 3 +++
 text.txt   | 0
 2 files changed, 3 insertions(+)
 create mode 100644 text.txt
root@dss:/home/dss/git# git branch -d dev
已删除分支 dev(曾为 5332ab5)。

# 再查看分支

# git branch
* master

 

解决冲突


 

STEP 1 创建新分支

# git checkout -b feature1

STEP 2 修改readme.txt

# 添加以下内容

Creating a new branch is quick AND simple.

STEP 3 提交

# git add readme.txt

# git commit -m "AND simple"
[feature1 59bb6fb] AND simple
 1 file changed, 1 insertion(+)

STEP 4 切换到master分支

# git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)

STEP 5 修改

# 在master分支下修改readme.txt,添加下面的话

Creating a new branch is quick & simple.

STEP 6 提交

# git add readme.txt

# git commit -m "& simple"
[master 0fff6bd] & simple
 1 file changed, 2 insertions(+), 12 deletions(-)

# master分支和feature1分支各自都分别有新的提交,变成了这样:

# 合并

# git merge feature1
自动合并 readme.txt
冲突(内容):合并冲突于 readme.txt
自动合并失败,修正冲突然后提交修正的结果。

# git status

# git status
位于分支 master
您的分支领先 'origin/master' 共 2 个提交。
  (使用 "git push" 来发布您的本地提交)
您有尚未合并的路径。
  (解决冲突并运行 "git commit")

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

    双方修改:   readme.txt

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

    git/

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

# cat readme.txt查看readme.txt

# cat readme.txt
Git is a version control system.
<<<<<<< HEAD
Git is free software.
Creating a new branch is quick & simple.
=======
Git is free software.
Git is a distributed version control system.
Git is free software.
Git is a distributed version control system.
Git is free software distributed under the GPL.
People people for me, me for people people!
Git has a mutable index called stage.
Git tracks changes.
123
456
My stupid boss still prefers SVN.
Creating a new branch is quick.
Creating a new branch is quick AND simple.
>>>>>>> feature1

STEP 7 手动修改

# 改变为将不同的地方删除,并改为

Creating a new branch is quick and simple.

STEP 8 提交

# git commit -m "conflict fixed"
[master 54124ee] conflict fixed

# 现在,master分支和feature1分支变成了下图所示:

 

# 用带参数的git log可以看到分支的合并情况:

# git log --graph --pretty=oneline --abbrev-commit
*   54124ee conflict fixed
|\  
| * 59bb6fb AND simple
* | 0fff6bd & simple
|/  
* 5332ab5 branch test
* e7c1227 git tracks changes
* f9923da git tracks changes
* b4bee5e understand how stage works
* 5ee00ca append GPL
* 9160615 add distributed
* 654e4d3 wrote a readme file

STEP 8 删除feature1分支

# git branch -d feature1

 

分支管理策略


 

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

# git checkout -b dev

# vim readme.txt

# git commit -m "new working"

# git checkout master

# git merge --no-ff -m "merge with no-ff" dev    # --no-ff参数,表示禁用Fast forward
Merge made by the 'recursive' strategy.
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

# git log --graph --pretty=oneline --abbrev-commit
*   27c0f57 merge with no-ff
|\  
| * 860a9bf new working  
|/  

 

Bug 分支


 

# git stash 可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

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

# git checkout master
# git checkout -b issue-101

# 现在修复bug,需要把“Git is free software ...”改为“Git is a free software ...”,然后提交:

# git add readme.txt 
# git commit -m "fix bug 101"

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

# git checkout master
# git merge --no-ff -m "merged bug fix 101" issue-101

# 回到dev分支

# git checkout dev

# git stash list   #回到刚才的工作现场

# Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

(1)git stash apply恢复,git stash drop来删除stash内容;

(2)git stash pop,恢复的同时把stash内容也删了.

 

Feature分支


 

# 创建新分支

# 开发完毕add commit

# 切回dev

(# 合并 删除)

 

多人协作


推送分支

git push origin master
git push origin dev

抓取分支

你的小伙伴要在dev分支上开发,就必须创建远程origindev分支到本地,于是他用这个命令创建本地dev分支:

git checkout -b dev origin/dev

然后就可以在dev上进行修改,提交

$ git add env.txt

$ git commit -m "add env"

你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:

推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置devorigin/dev的链接:

再pull:

这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:

 

Rebase


 

  • rebase操作可以把本地未push的分叉提交历史整理成直线;

  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比

 

标签


 

  • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

  • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;

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

  • 命令git push origin <tagname>可以推送一个本地标签;

  • 命令git push origin --tags可以推送全部未推送过的本地标签;

  • 命令git tag -d <tagname>可以删除一个本地标签;

  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

 

posted on 2018-07-23 20:14  董大志  阅读(124)  评论(0)    收藏  举报

导航