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 mastergit push origin dev
抓取分支
你的小伙伴要在
dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地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分支的链接,根据提示,设置dev和origin/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>可以删除一个远程标签。
浙公网安备 33010602011771号