>_git项目分支太多 管理工具">
赞
踩
issue102
分支和master
分支下对issue102.md
文件进行了修改,当我们将issue102分支融合到主分支上时就会发生冲突。git status
查看命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。当出现矛盾后,合并的文件内容将会出现"<<<<<<“,”=======“,”>>>>>>"等分割线来进行标记。【分支的创建】
Git分支的创建十分简单,我们可以使用git branch
来查看现有的分支或创建新的分支。当不带任何命令参数时,输入git branch
可以帮助我们查看当前项目所拥有的全部分支。并且Git会使用*来标明我们当前所处的分支上。
git branch
结果为:
* master
当我们想要新增加新的分支时,只需要在git branch
命令后面加上我们想要新建的分支的名称即可。
# 创建issue102的分支
git branch issue102
# 查看现有的所有分支
git branch
# 现有的分支
issue102
*master
我们可以发现虽然创建了issue102
的分支,但是当前分支还是在master上。我们可以通过git checkout
命令来进行切换分支。
【分支的切换】
在上面的例子中我们发现虽然创建了新的分支,但是当前分支还是在master
分支上,我们需要通过git checkout
命令切换到新建的issue102
分支上,来进行后续的开发操作。
git checkout issue102
Switched to branch 'issue102'
这是我们可以在查看下当前分支的状态,我们可以发现当前分支已经转换到了issue102
分支上。
git branch
* issue102
master
切换分支后,我们就可以进行自己的开发。分支上的文件状态是不同的。我们可以通过下面的例子有着更深入的了解。
# 切换分支
git checkout issue102
# 在分支上创建下新的文件
touch issue102.md
git add issue102.md
git commit -m "update issue102.md"
touch issue102.html
git add issue102.html
git commit -m "update issue102.html"
实际操作如下:
在完成上述命令后,我们可以通过git log --oneline
检查下当前Git的记录。
cd836b0 (HEAD -> issue102) update issue102.html
7575f02 update issue102.md
242c407 (master) update hello.md
我们可以发现issue102分支上的记录与master的记录间隔开了。除此之外,当我们切换回主分支后,我们还会发现master分支下没有新建的issue102.md和issue102.html两个文件。正如下图所示:
当我们在分支上完成来开发工作后,我们需要将我们在当前分支进行的工作合并到主分支上。首先我们需要切回需要合并到的分支上,此处以issue102
合并到master
上为例子进行演示。
# 切换回主分支
git checkout master
# 使用git merge 进行合并
git merge issue102
# git branch --no-merged
# 查看所有未合并工作的分支
我们可以发现原来在issue102
分支上的文件已经合并到了主分支上了,并且issue102
分支还存在。大家可以根据实际的需求进行分支的保留与删除。
有时候分支的合并不会一番顺利,当我们在两个分支中对同一个文件的同一个部分进行了不同的修改,Git就没有办法顺利的合并他们,会在合并的时候产生合并冲突。比如我们在issue102
分支和master
分支下对issue102.md
文件进行了修改,当我们将issue102分支融合到主分支上时就会发生冲突。如下图所示:
我们也可以通过git status
查看命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。当出现矛盾后,合并的文件内容将会出现"<<<<<<“,”=======“,”>>>>>>"等分割线来进行标记。如下图所示:
当出现了矛盾时,我们需要进行手动解决或者放弃合并。
手动合并
手动合并的方法很简单,就是我们选择我们要保留的代码,然后再把>>>>>, ======, <<<<<<这些提示行给去掉。最后重新进行add commit的操作即可。
放弃合并
当我们发现冲突所导致的改动量很大时,我们可以选择放弃该次的合并。我们可以使用git merge --abort
放弃此次的融合。如果我们在运行了git merge之后又进行了一些人为的改动,那么在abort之后,所进行的改动也会被回滚掉。
mergetool
除了手动合并以及放弃合并之外,我们还有一些其他的合并工具。git官方开发了一个专门用来合并的工具,叫做git mergetool(下图所示),它会将找到一份两个分支的祖先代码作为base(基准),然后再将两个分支的改动都列举出来作为对比,让我们在git编辑器当中决定要留下什么。在此处,我们不做过多的阐述,感兴趣的同学可以点击下方链接进行查看。
在很多情况下,我们都需要将分支推送到远程,在这一部分,我们将讲一些远程的相关操作。
首先,我们可以使用git remote -v
查看远程库的详细信息。会显示我们可以抓取或推送的origin地址。
$ git remote -v
origin git@github.com:ProjectOwner/ProjectName.git (fetch)
origin git@github.com:ProjectOwner/ProjectName.git (push)
当我们需要推送本地分支到远程时,需要指定具体的本地分支。
# 推送本地的master分支到远程
git push origin master
# 推送本地的issue102分支到远程
git push origin issue102
但是当我们多人协作进行开发的时候,可能会出现远程分支比我们本地更新的情况,这时,我们就需要使用git pull
的命令来试图合并。如果合并出现冲突时,我们需要解决冲突再提交。
更多参考:廖雪峰老师的Git教程中的多人协作。
在Git中没有什么分支是不可以删除的(除了当前所在的分支不能删除),包括master
分支也是可以进行删除。
Git的分支删除可以分为删除本地分支和远程分支。
# branchName 是需要删除的本地分支名字
git branch -d branchName
当我们想强行删除分支时,只需要将参数d改为D即可。
# origin 是远程的主机名
# branch 需要删除的远程分支
git push origin --delete branch
当我们需要重命名分支的名称时,我们可以使用git branch
命令来进行,具体方式如下:
# oldBranchName: 旧分支名
# newBranchName :新分支名
git branch -m oldBranchName newBranchName
当我们想要将改名后的分支推送到远程时,我们需要进行如下操作:
git branch -m oldBranchName newBranchName # 将本地的分支进行重命名
git push origin newBranchName # 将新的分支推送到远程
git push --delete origin oldBranchName # 删除远程的旧的分支
常见的分支开发工作流程:
由于分支管理的便捷,才衍生出这些典型的工作模式,可以根据项目实际情况进行使用。
在实际开发中,我们应该按照以下几个基本原则进行分支开发工作流程
本章主要介绍 Git 常用的工具,可能不会经常用到
需要一些简单的文件和目录来演示该章节,如果可以的话,请 fork 这个演示项目至你的个人账号下。
https://github.com/datawhalechina-git-samples/app
后续演示均以这个 repo 操作。
Git 支持多种方式来引用单个提交、一组提交或一定范围内的提交。
你可以通过任意一个提交的 40 位字符的 SHA-1
散列值来指定它。
$
是终端交互的提示符,不需要输入。如果系统或者终端不一样,只需输入$
后的内容即可,本文后续不再累述
切换至本项目工作目录,执行 git log
能看到类似提交日志的输出。(shell 通过 pipe |
将输出信息传递给 more
做多页显示)。
$ git log | more
commit 44328544187650f2f6ecc253ef3a2b099c51baa5
Author: Martin Xu <martin.xus@gmail.com>
Date: Wed May 4 13:41:55 2022 +0800
add model module
commit a55ea122894272b13c3a43129ca0b74cfd2b6a4a
Author: Martin Xu <martin.xus@gmail.com>
Date: Wed May 4 13:33:17 2022 +0800
Initial commit
从日志能明显的看到多次提交的记录,每次包括 commit
+ 一串字符、作者、提交时间 和详细信息等。
这里的主角就是 commit 后跟的 40 位的字符,这个值是一个 SHA-1 哈希值。它是对内容和头信息 Header 的一个校验和 checksum,Git 使用 SHA-1 并不是为了数据的安全性,而是数据的完整性;它保证,在很多年后,你重新 checkout 某个 commit 时,一定是当时的状态,完全一摸一样。 有兴趣进一步了解这个 SHA-1 的值,可以 参考这里。
想查看某次提交信息,可以通过 git show
来查看,如:
$ git show 44328544187650f2f6ecc253ef3a2b099c51baa5 commit 44328544187650f2f6ecc253ef3a2b099c51baa5 (HEAD -> main, origin/main, origin/HEAD) Author: Martin Xu <martin.xus@gmail.com> Date: Wed May 4 13:41:55 2022 +0800 add model module diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f9d131a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "model"] + path = model + url = https://github.com/datawhalechina-git-samples/model diff --git a/model b/model new file mode 160000 index 0000000..a8328fd --- /dev/null +++ b/model @@ -0,0 +1 @@ +Subproject commit a8328fd6ee683ef8f6a2d7c4edfefed2923b0795
查看所有所有提交 SHA-1 字符串
$ git log|grep '^commit'|awk '{print $2}'
44328544187650f2f6ecc253ef3a2b099c51baa5
a55ea122894272b13c3a43129ca0b74cfd2b6a4a
Git 非常聪明的知道在没有歧义的情况下,通过前几个字符来替代上述 40 位字符,如上可简化成:
$ git show 4432854
甚至简化成
$ git show 4432
当然你的确保没有歧义。Git 可以为 SHA-1 值生成出简短且唯一的缩写,可以在 git log
后加 --abbrev-commit
参数,输出结果就会显示简短且唯一的值了。默认情况使用 7 个字符,有时为来避免歧义,会增加字符数。
$ git log --abbrev-commit
commit 4432854 (HEAD -> main, origin/main, origin/HEAD)
Author: Martin Xu <martin.xus@gmail.com>
Date: Wed May 4 13:41:55 2022 +0800
add model module
commit a55ea12
Author: Martin Xu <martin.xus@gmail.com>
Date: Wed May 4 13:33:17 2022 +0800
Initial commit
通过在 git log
后增加 --pretty=oneline
简化输出内容
$ git log --abbrev-commit --pretty=oneline
4432854 (HEAD -> main, origin/main, origin/HEAD) add model module
a55ea12 Initial commit
如果你要查看一个分支的最后一次对象,可以通过分支名查看。查看本地分支列表通过git branch
查看
$ git branch
develop
main
* stable
*
表示当前工作的分支
查看远程分支通过后加参数-r
$ git branch -r
origin/HEAD -> origin/main
origin/main
origin/stable
我们尝试通过git show stable
查看指定分支最后一次提交信息
$ git show stable commit 11671bae8489621c02a4c99dbcf24b0dede1b1b1 (HEAD -> stable) Author: Martin Xu <martin.xus@gmail.com> Date: Wed May 4 14:16:00 2022 +0800 stable model for app diff --git a/.gitmodules b/.gitmodules index f9d131a..47d8924 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "model"] path = model url = https://github.com/datawhalechina-git-samples/model + branch = stable diff --git a/model b/model index a8328fd..ca79fae 160000 --- a/model +++ b/model @@ -1 +1 @@ -Subproject commit a8328fd6ee683ef8f6a2d7c4edfefed2923b0795 +Subproject commit ca79fae869c9b4ddd7999f06ffd48ac25971b9dd
如果你的 branch 的名称和当前目录名称很不巧的重名了,那么应该会出现意外的输出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。