Linux ·

GitHub使用方法入门基础

分支与合并

Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

分支

  • 一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 experimental的分支:
[root@linuxidc project]# git branch experimental
  • 运行git branch命令可以查看当前的分支列表,已经目前的开发环境处在哪个分支上:
[root@linuxidc project]# git branch
  experimental
* master
  • experimental 分支是你刚才创建的,master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名可以切换到其他分支:
[root@linuxidc project]# git checkout experimental
切换到分支 'experimental'
  • 切换到experimental分支,切换完成后,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支:
[root@linuxidc project]# echo "update" >> file1 # 修改file1文件
[root@linuxidc project]# git status # 使用 git status 查看当前状态
# 位于分支 experimental
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: file1
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@linuxidc project]# git add file1 # 添加并提交file1的更改
[root@linuxidc project]# git commit -m "update file1"
[experimental 3251fbe] update file1
 1 file changed, 1 insertion(+)
[root@linuxidc project]# cat file1 #查看file1文件的内容
test
update
[root@linuxidc project]# git checkout master #切换至master分支

切换到分支 'master'

查看下file1中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental分支下,现在切换回了master分支,目录下的文件都是master分支上的文件了。

  • 现在可以在master分支下再作一些不同的修改:
[root@linuxidc project]# echo 'update again' >> file2 #修改file2文件

[root@linuxidc project]# git status #查看当前状态

# 位于分支 master

# 尚未暂存以备提交的变更:

# (使用 "git add <file>..." 更新要提交的内容)

# (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

# 修改: file2

#

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

[root@linuxidc project]# git add file2 #添加并调教file2的修改

[root@linuxidc project]# git commit -m "update file2 on master"

[master 7f50340] update file2 on master

 1 file changed, 1 insertion(+)

[root@linuxidc project]# cat file2 #查看file2的修改

test

update again

这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

  • 可以通过下面的git merge命令来合并experimental到主线分支master:
[root@linuxidc project]# git checkout master # 切换至master 分支

已经位于 'master'

[root@linuxidc project]# git merge -m "merge experimental branch" experimental #将 experimental 分支合并至master分区

Merge made by the 'recursive' strategy.

 file1 | 1 +

 1 file changed, 1 insertion(+)

-m参数仍然是需要填写合并的注释信息。

由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。

  • 如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。首先我们在master分支上修改file3文件并提交:
[root@linuxidc project]# git checkout master # 切换至 master 分区

已经位于 'master'

[root@linuxidc project]# echo "master:update file3" >> file3 # 修改 file3 文件

[root@linuxidc project]# git status # 查看当前状态

# 位于分支 master

# 尚未暂存以备提交的变更:

# (使用 "git add <file>..." 更新要提交的内容)

# (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#

# 修改: file3

#

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

[root@linuxidc project]# git commit -a -m 'update file3 on master' #提交至master分区

[master 2922456] update file3 on master

 1 file changed, 1 insertion(+)

[root@linuxidc project]# git status #在次查看状态

# 位于分支 master

无文件要提交,干净的工作区
  • 然后切换到experimental,修改file3并提交:
[root@linuxidc project]# git checkout experimental # 切换至 experimental 分支
切换到分支 'experimental'
[root@linuxidc project]# echo "experimental: update file3" >> file3 # 修改 file3 文本
[root@linuxidc project]# git commit -a -m 'update file3 on experimental' # 提交至experimental 分支
[experimental e511488] update file3 on experimental
 1 file changed, 1 insertion(+)
  • 切换到master进行合并:
[root@linuxidc project]# git checkout master # 切换至 master 分支
切换到分支 'master'
[root@linuxidc project]# git merge experimental # 合并分支
自动合并 file3
冲突(内容):合并冲突于 file3
自动合并失败,修正冲突然后提交修正的结果。
  • 合并失败后先用git status查看状态,会发现file3显示为both modified,查看file3内容会发现:
[root@linuxidc project]# git status #查看状态
# 位于分支 master
# 您有尚未合并的路径。
# (解决冲突并运行 "git commit")
#
# 未合并的路径:
# (使用 "git add <file>..." 标记解决方案)
#
# 双方修改: file3
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@linuxidc project]# cat file3 # 查看产生冲突的文件
test
<<<<<<< HEAD
master:update file3
=======
experimental: update file3
>>>>>>> experimental

上面的内容也可以使用git diff查看,先前已经提到git diff不加参数可以显示未提交到缓存区中的修改内容。

  • 可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3和git commit命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。
[root@linuxidc project]# vim file3 # 使用 vim 打开文件修改

[root@linuxidc project]# git status #查看状态

# 位于分支 master

# 您有尚未合并的路径。

# (解决冲突并运行 "git commit")

#

# 未合并的路径:

# (使用 "git add <file>..." 标记解决方案)

#

# 双方修改: file3

#

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

[root@linuxidc project]# git add file3 # 将文件加入缓存

[root@linuxidc project]# git status # 再次查看状态

# 位于分支 master

# 所有冲突已解决但您仍处于合并中。

# (使用 "git commit" 结束合并)

#

# 要提交的变更:

#

# 修改: file3

#

[root@linuxidc project]# git commit -m 'merge file3' # 提交修改的文件

[master 6b63f36] merge file3
  • 当我们完成合并后,不再需要experimental时,可以使用下面的命令删除:
[root@linuxidc project]# git branch -d experimental
已删除分支 experimental(曾为 e511488)。

git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D

撤销一个合并

  • 如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
[root@linuxidc project]# git reset --hard HEAD^
HEAD 现在位于 2922456 update file3 on master
[root@linuxidc project]# cat file3
test
master:update file3

推送至远程仓库

  • 在本机完成改动后就可以提交到远程仓库了
git push origin master

可以把 master 换成你想要推送的任何分支。

  • 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>

如此你就能够将你的改动推送到所添加的服务器上去了。

更新与合并

  • 要更新你的本地仓库至最新改动,执行:
git pull

以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。

  • 要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
  • 在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add <filename>
  • 在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>

参与评论