【Git】常用命令和sourceTree的使用

目录

Git的相关术语

【SourceTree的应用】

实例

1.如何去除某个分支中的某个提交?

2.如何去除某个分支中的某些提交?(如develop分支回退到之前的某个节点)

3.如何删除某个分支合并的代码?

4.如何选择某个分支的部分代码进行合并提交?

5.如何删除某个分支中的部分代码(如develop分支上有a,b,c,d,e五个提交,需要删除c,d两次提交)?

6、变基操作在SourceTree上的使用

其他知识:

常用命令

git中fetch和pull的区别

Git中的HEAD解释


Git的相关术语

这里推荐一个在线学习的git网站:Learn Git Branching

术语&相关解释

工作原理

工作区(workspace)

程序员进行开发改动的地方,是你当前看到的,也是最新的。平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。

暂存区(index)

.git目录下的index文件, 暂存区会记录 git add 添加文件的相关信息(文件名、大小、timestamp…),不保存文件实体, 通过id指向每个文件实体。可以使用 git status 查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过 git add 先提交到暂存区,被git管理。

本地仓库(repository)

保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些。git commit 后同步index的目录树到本地仓库,方便从下一步通过 git push 同步本地仓库与远程仓库的同步。

远程仓库(remote)

远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。

【SourceTree的应用】

实例

常用SourceTree的重置当前分支到此次提交

使用场景:“我想把已提交未推送的修改撤销”

SourceTree中的“重置提交”相当于git reset命令

提示:所有git操作(例如:回滚,重置提交等)只要没有push到远程仓库,即可放心大胆的尝试,因为只会修改本地仓库。

【Git】常用命令和sourceTree的使用_第1张图片

使用模式 说明
软合并 软合并是指将此次提交回滚到指定提交位置,但这个过程中会将修改过的文件暂存到暂存区。
混合合并 混合合并是指将此次提交回滚到指定的位置,但这个过程中不会将修改过的文件暂存到暂存区,而是将修改过的文件存放在未暂存文件区。
强行合并 强行合并是指将此次提交回滚到指定的位置,但这个过程中将直接丢弃之前修改的所有文件,
因此在选取此种合并时需要考虑清楚,避免一些不必要的麻烦。

1.如何去除某个分支中的某个提交?

使用回滚。对于需去除的commit提交。右击弹出弹窗,点击提交回滚,如果有冲突,即先解决冲突。没有冲突则直接提交推送。

【Git】常用命令和sourceTree的使用_第2张图片

sourceTree的提交回滚,是将你所操作分支的提交回归初态,换句话说就是取消该提交的所有东西。但是不会影响该提交之后提交的所有东西。例如,当前是c,但是做了回滚a的操作,只会将a提交的东西清空,代码里面还是会保留b和c提交的代码。需要注意的是b、c的操作可能会引起提交回滚a的时候产生冲突

【Git】常用命令和sourceTree的使用_第3张图片

2.如何去除某个分支中的某些提交?(如develop分支回退到之前的某个节点)

和提交回滚的区别在于:提交回滚是某个commit,重置提交是这次提交之后的提交均重置

使用"重置到这次提交"的功能。在要重置的节点右击选择将xxx重置到这次提交的选项。如图

【Git】常用命令和sourceTree的使用_第4张图片

点击确定

【Git】常用命令和sourceTree的使用_第5张图片

这时会发现你有x个提交可以拉取,这时候如果拉取就会恢复到之前的样子。

【Git】常用命令和sourceTree的使用_第6张图片

我们是要回退这些提交到之前的节点,所以需选择推送,强制推送即可(注意:这里强制推送后,远程的版本就和本地的回退版本一致了,所以需要谨慎推送)

【Git】常用命令和sourceTree的使用_第7张图片

3.如何删除某个分支合并的代码?

情景:如你的develop分支合并了feature/xxxx分支,但是这个功能突然又被产品告知不要在这个版本上了,如何删除feature/xxxx分支合并进来的代码呢?

如果,这个分支合并之后的代码你都不需要了,都要丢弃,那么方法如2一样,直接回退到xxxx节点。如果这个合并之后的代码还有部分需要,可参考问题5(遴选方式)的解决思路。

4.如何选择某个分支的部分代码进行合并提交?

情景:做需求的时候,你的功能分支中部分功能可能被产品临时告知要废弃,那么如何处理?

遴选:即拷贝其中的某一次提交记录,每次只能一个提交

可使用 git 的 cherry-pick 命令 如

git cherry-pick 4db0729d

对于sourcetree 即是遴选功能。选择要被提交过来的节点,右击,选择遴选选项。

step:

  1. 先切换到线上分支(例: master-smd),拉取最新代码
  2. 找到开发分支(不切换分支)
  3. 在开发分支的提交记录上,找到要遴选到线上分支的那条提交记录
  4. 右击那条提交记录,找到遴选,再点击确定就行

【Git】常用命令和sourceTree的使用_第8张图片

5.如何删除某个分支中的部分代码(如develop分支上有a,b,c,d,e五个提交,需要删除c,d两次提交)?

情景:比如你把某个功能已经合并到了你的开发分支,同时之后还提交了一些代码。但是这个功能突然被告知要下架,这时候如何处理?

首先到达节点a,从该处拉出一个新分支如copy_develop,然后选择遴选b,e。在回到原来的develop分支,重置到a这次的提交。然后再把copy_develop分支的代码合并到develop分支即可。

6、变基操作在SourceTree上的使用

情景:
多人同时开发,小明同学在dev1分支上开发,“我”在dev2分支上开发;
小明同学开发完成并提交了代码到他的dev1分支上,“我”也开发完成并提交到dev2上;
现在“我”要把小明的代码,同步到“我”的分支,也就是,dev1同步到dev2。

  1. 拉公共分支最新代码——rebase,也就是git pull -r或git pull --rebase。这样的好处很明显,提交记录会比较简洁。但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛,所以看个人需求了。总体来说,即使是单机也不建议使用。
  2. 往公共分支上合代码——merge。如果使用rebase,那么其他开发人员想看主分支的历史,就不是原来的历史了,历史已经被你篡改了。举个例子解释下,比如张三和李四从共同的节点拉出来开发,张三先开发完提交了两次然后merge上去了,李四后来开发完如果rebase上去(注意,李四需要切换到自己本地的主分支,假设先pull了张三的最新改动下来,然后执行,然后再git push到远端),则李四的新提交变成了张三的新提交的新基底,本来李四的提交是最新的,结果最新的提交显示反而是张三的,就乱套了,以后有问题就不好追溯了。
  3. 正因如此,大部分公司其实会禁用rebase,不管是拉代码还是push代码统一都使用merge,虽然会多出无意义的一条提交记录“Merge … to …”,但至少能清楚地知道主线上谁合了的代码以及他们合代码的时间先后顺序

step:

  1. 小明同学提交代码到 develop,“我”把分支切换到 develop,并拉取最新代码
  2. 然后“我”切换到 fix-bug,并选中小明同学提交的 develop 分支代码
  3. 鼠标右击,选中“变基”,点击“确定”,变基完成

其他知识:

常用命令

git add 指定文件

git commit -m ""

重新提交追加的代码:

git commit -a --amend --no-edit # 不修改提交信息 可产生新的patch,不会生成新的评审提交

git commit -a --amend -m "提交信息"

提交代码评审(git+gerrit的方式,使用以下命令提交评审):

# git push <远程主机名> <本地分支名>:<远程分支名>

git push origin HEAD:refs/for/master

# git pull <远程主机名> <远程分支名>:<本地分支名>

git pull origin master:brantest(冒号后可以省略,省略即merge到本地当前分支)

git中fetch和pull的区别

    git fetch 从远端仓库下载新分支与数据,需要手动merge
    git pull 从远端仓库提取数据并尝试合并到当前分支

Git 有两个命令用来从某一远端仓库更新。 git fetch 会使你与另一仓库同步,提取你本地所没有的数据,为你在同步时的该远端的每一分支提供书签。 这些分支被叫做“远端分支”,除了 Git 不允许你检出(切换到该分支)之外,跟本地分支没区别 —— 你可以将它们合并到当前分支,与其他分支作比较差异,查看那些分支的历史日志,等等。同步之后你就可以在本地操作这些。

第二个会从远端服务器提取新数据的命令是 git pull。 基本上,该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 不太喜欢这命令 —— 也可以 fetch 和 merge 分开来做。少点魔法,少点问题。 不过,如果你喜欢,你可以看一下 git pull 的 官方文档。

假设你配置好了一个远端,并且你想要提取更新,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

Git中的HEAD解释

HEAD
HEAD 指向当前所在分支提交至仓库的最新一次的 commit

# 使用最新一次提交重制暂存区
git reset HEAD -- filename

# 使用最新一次提交重制暂存区和工作区
git reset --hard HEAD

# 将 commit log 回滚一次 暂存区和工作区代码不变
git reset --soft HEAD~1

在pycharm等ide中可以操作如下界面来重置commit(git)

【Git】常用命令和sourceTree的使用_第9张图片【Git】常用命令和sourceTree的使用_第10张图片

HEAD~{n}
~ 是用来在当前提交路径上回溯的修饰符
HEAD~{n} 表示当前所在的提交路径上的前 n 个提交(n >= 0):

HEAD = HEAD~0
HEAD~ = HEAD~1
HEAD~~ = HEAD~2
HEAD{n个~} = HEAD~n

HEAD^n
^ 是用来切换父级提交路径的修饰符。当我们始终在一个分支比如 dev 开发/提交代码时,每个 commit 都只会有一个父级提交,就是上一次提交,但当并行多个分支开发,feat1, feat2, feat3,完成后 merge feat1 feat2 feat3 回 dev 分支后,此次的 merge commit 就会有多个父级提交。

示例:

# 当前提交
HEAD = HEAD~0 = HEAD^0

# 主线回溯
HEAD~1 = HEAD^ 主线的上一次提交
HEAD~2 = HEAD^^ 主线的上二次提交
HEAD~3 = HEAD^^^ 主线的上三次提交

# 如果某个节点有其他分支并入
HEAD^1 主线提交(第一个父提交)
HEAD^2 切换到了第2个并入的分支并得到最近一次的提交
HEAD^2~3 切换到了第2个并入的分支并得到最近第 4 次的提交
HEAD^3~2 切换到了第3个并入的分支并得到最近第 3 次的提交

# ^{n} 和 ^ 重复 n 次的区别
HEAD~1 = HEAD^
HEAD~2 = HEAD^^
HEAD~3 = HEAD^^^
# 切换父级
HEAD^1~3 = HEAD~4
HEAD^2~3 = HEAD^2^^^
HEAD^3~3 = HEAD^3^^^

总结:

  1. 变基和merge会产生不一样的git log,相比于变基(rebase),merge合入代码更实用
  2. 回滚指定commit——用“回滚提交”;回滚批量commit——用“重置到某次提交”
  3. 不同分支的指定commit合入——用“遴选”

参考文章:

git push origin HEAD:refs/for/master 的意思

手把手教你搭建自己的git+gerrit代码评审服务器

【Git】全套操作教程(开发必知)

【Git】pull 分支报错 fatal: Need to specify how to reconcile divergent branches
【sourceTree】回滚提交 和 重置当前分支到此次提交 的区别
SourceTree 拉取、重置提交、回滚、变基与合并

你可能感兴趣的:(git,github)