所以我一直在使用git merge,但我不知道它是添加合并分支中的所有提交还是仅添加最后一个提交
例如,如果我有一个分支A和一个分支B
A提交了1 2 5
B提交了3 4
所以,如果我在分支A中进行git merge B会发生什么情况
如果我在分支B中进行git merge A会发生什么情况
我最想知道的是,合并完成后,所有提交都添加到当前分支中还是仅最后一个提交中,会发生什么
我是git的新手,请原谅
答案 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
这里发生了什么,您只需创建一个链接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
那有什么区别?冲突的顺序,但更重要的是您所在的最终分支的名称。
因此,合并创建另一个提交,以将分支的不同历史记录链接到另一个(这就是为什么在该示例中不重复提交0的原因)。
您应该玩git commit
git log --graph --oneline --all
。但这似乎超出了这个问题的范围。
如果您只想从分支创建单个提交以添加到另一个分支,则可以rebase
和squash
当您边做边学时,Git会变得更容易。经常检查您的rebase
。了解如何使用git log
来获得信心(这是git很棒的原因)并为git reflog
命令提供机会。然后与您的团队讨论并确定最佳的工作流程。
答案 1 :(得分:0)
相反:
a。重新设置基准将通过复制它们带来所有“不同”的提交;他们将“表现”,就像最初为当前分支创建的本机提交
b。 cherry-pick仅复制一次提交(如果使用分支名称作为参数,则为最后一个提交);但您可以指定一个范围