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>