git merge是否添加所有提交或仅添加最后一个提交?

时间:2018-08-24 20:00:32

标签: git merge git-merge

所以我一直在使用git merge,但我不知道它是添加合并分支中的所有提交还是仅添加最后一个提交

例如,如果我有一个分支A和一个分支B

  • A提交了1 2 5

  • B提交了3 4

所以,如果我在分支A中进行git merge B会发生什么情况

如果我在分支B中进行git merge A会发生什么情况

我最想知道的是,合并完成后,所有提交都添加到当前分支中还是仅最后一个提交中,会发生什么

我是git的新手,请原谅

2 个答案:

答案 0 :(得分:3)

您可以很容易地自己进行实验(需要使用终端)

在命令行中转到您喜欢的文件夹:

创建一个空的仓库

import pandas as pd
date= '2018-04-05'
#df['date'] = pd.to_datetime(df.date)

df[df.date.dt.normalize() == date].index.values
#array([3], dtype=int64)

添加一些内容(我们将创建一个文件,每次提交时我们都会更改内容)

mkdir test-repo
cd test-repo
git init

创建分支A

echo 0 > file.txt
git add file.txt
git commit -m '0'

创建分支B

git checkout -b A
echo 1 > file.txt; git add file.txt; git commit -m '1'
echo 2 > file.txt; git add file.txt; git commit -m '2'
echo 3 > file.txt; git add file.txt; git commit -m '3'
git log --graph --oneline --all

因此,在分支A中,我们有一个数字3的文件,在分支B中有一个数字5的文件 让A合并成B(记住,您当前的分支是B)

git checkout master
git checkout -b B
echo 4 > file.txt; git add file.txt; git commit -m '4'
echo 5 > file.txt; git add file.txt; git commit -m '5'
git log --graph --oneline --all

您将看到一个容易解决的冲突

git merge B

已修复并提交:

cat file.txt

<<<<<<< HEAD
5
=======
3
>>>>>>> A

历史记录如下: enter image description here

这里发生了什么,您只需创建一个链接A int B的新提交,此提交具有两个分支之间的冲突解决方案。 而且你仍然在分支B

这意味着您可以删除此提交,然后仅删除此提交即可返回预览状态:

git commit
git log --graph --oneline --all

所以现在让我们做另一种方法,转到分支A并让“将B合并到A”。

git reset --hard HEAD~1
git log

再次解决看起来很相似但不完全相同的冲突

git checkout A
git merge B

解决冲突,您应该处于相同状态,但从技术上讲不是这样:) 您在B分支中

cat file.txt


<<<<<<< HEAD
3
=======
5
>>>>>>> B

enter image description here

那有什么区别?冲突的顺序,但更重要的是您所在的最终分支的名称。

因此,合并创建另一个提交,以将分支的不同历史记录链接到另一个(这就是为什么在该示例中不重复提交0的原因)。

如果您喜欢干净的历史记录,则最终的历史记录如下: enter image description here

您应该玩git commit git log --graph --oneline --all 。但这似乎超出了这个问题的范围。

如果您只想从分支创建单个提交以添加到另一个分支,则可以rebasesquash

当您边做边学时,Git会变得更容易。经常检查您的rebase。了解如何使用git log来获得信心(这是git很棒的原因)并为git reflog命令提供机会。然后与您的团队讨论并确定最佳的工作流程。

答案 1 :(得分:0)

  1. 提交不会“移动”到分支。
  2. git中的每个提交都存储到父提交的链接。
  3. 合并提交具有2个或多个父提交(它们通常是适当分支的HEAD)
  4. 因为那些提交仍然保留其父提交合并操作,实际上“将所有不同的提交(以前在当前分支中不存在)带入当前分支”。实际上意味着您一旦删除合并提交(使用git reset或git revert),就会从当前分支中“删除”它们

相反:

a。重新设置基准将通过复制它们带来所有“不同”的提交;他们将“表现”,就像最初为当前分支创建的本机提交

b。 cherry-pick仅复制一次提交(如果使用分支名称作为参数,则为最后一个提交);但您可以指定一个范围