- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
从我读到的内容来看,它们都帮助我们获得了线性历史。
根据我的实验,rebase 一直有效。但是merge --ff-only 只适用于可以快进的场景。
我还注意到,git merge 创建了一个 merge 提交,但是如果我们使用 --ff-only,它会给出一个线性历史,基本上等于 git rebase。所以 --ff-only 扼杀了 git merge 的目的,对吧?
那么它们之间的实际区别是什么?
最佳答案
请注意 git rebase
与 git merge
的工作不同(有或没有 --ff-only
)。什么 rebase
所做的是获取现有的提交并复制它们。例如,假设您在 branch1
上并进行了两次提交 A
和 B
:
...-o--o--A--B <-- HEAD=branch1
\
o--C <-- branch2
并且您决定更愿意将这两个提交放在
branch2
上相反。你可以:
A
中所做的更改列表(diff A
与其父级的差异) B
中所做的更改列表(差异 B
对 A
) branch2
A
中所做的相同的更改并提交它们,从 A
复制您的提交消息;让我们称这个提交 A'
B
中所做的相同的更改并提交它们,从 B
复制您的提交消息;让我们称之为 B'
. git cherry-pick
.所以:
git checkout branch2 # switch HEAD to branch2 (commit C)
git cherry-pick branch1^ # this copies A to A'
git cherry-pick branch1 # and this copies B to B'
现在你有这个:
...-o--o--A--B <-- branch1
\
o--C--A'-B' <-- HEAD=branch2
现在您可以切换回
branch1
并删除您原来的
A
和
B
, 使用
git reset
(我将在这里使用
--hard
,这样更方便,因为它也清理了工作树):
git checkout branch1
git reset --hard HEAD~2
这删除了原来的
A
和
B
,1 所以现在你有:
...-o--o <-- HEAD=branch1
\
o--C--A'-B' <-- branch2
现在您只需要重新退房
branch2
继续在那里工作。
git rebase
确实:它“移动”提交(虽然不是通过实际移动它们,因为它不能:在 git 中,提交永远不能更改,因此即使只是更改父 ID 也需要将其复制到新的和略有不同的提交)。
git cherry-pick
是一次提交的自动差异和重做,
git rebase
是一个重做多次提交的自动化过程,最后,移动标签以“忘记”或 stash 原始标签。
branch1
移动提交到另一个本地分行
branch2
,但是当你有一个远程跟踪分支时,git 使用完全相同的过程来移动提交,当你执行
git fetch
时获取一些新的提交。 (包括
fetch
,这是
git pull
的第一步)。您可以从分支
feature
开始工作,其上游为
origin/feature
,并进行一些你自己的提交:
...-o <-- origin/feature
\
A--B <-- HEAD=feature
但是你决定你应该看看上游发生了什么,所以你运行
git fetch
,2 而且,啊哈,上游有人写了一个提交
C
:
...-o--C <-- origin/feature
\
A--B <-- HEAD=feature
此时您可以简单地重新设置您的
feature
的
A
和
B
到
C
,给:
...-o--C <-- origin/feature
\
A'-B' <-- HEAD=feature
这些是您原件的副本
A
和
B
, 副本完成后将原件扔掉(但请参阅脚注 1)。
fetch
之前的图看起来像这样:
...-o <-- origin/feature
`-- HEAD=feature
如果你那么
git fetch
并提交
C
进来,但是,你留下了你的
feature
指向旧提交的分支,而
origin/feature
已经前进:
...-o--C <-- origin/feature
`---- <-- HEAD=feature
这是哪里
git merge --ff-only
进来:如果您要求 merge 您当前的分支
feature
与
origin/feature
, git 看到可以像以前一样向前滑动箭头,以便
feature
直接指向提交
C
.不需要实际 merge 。
A
和
B
但是,您要求将它们与
C
merge , git 会进行真正的 merge ,进行新的 merge 提交
M
:
...-o--C <-- origin/feature
\ `-_
A--B--M <-- feature
在这里,
--ff-only
将停止并给你一个错误。另一方面,rebase 可以复制
A
和
B
至
A'
和
B'
然后 stash 原来的
A
和
B
.
A
和
B
,您可以使用
git rebase
;但如果有充分的理由不复制它们,您可以使用
git merge
,也许与
--ff-only
, 酌情 merge 或失败。
HEAD
的位置的历史记录。指出,在更新分支和/或
HEAD
的每个更改之前.
git pull
,这是一个从运行
git fetch
开始的便捷脚本.获取完成后,便利脚本运行
git merge
或
git rebase
,取决于您如何配置和运行它。
关于git - git rebase 和 git merge --ff-only 之间有区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140434/
我觉得 for(int i = 0; i < 2; i++) 和 for(int i = 0; i < 2; ++i) 不应该做同样的事情。对于第二个例子,从循环开始 i 应该等于 1 对我来说更符合
我试图牢牢掌握异常情况,以便改进我的conditional loop implementation .为此,我进行了各种实验,扔东西,看看会被抓到什么。 这个让我惊喜不已: % cat X.hs mo
我只是想回答一个问题,但我遇到了一些我不明白的事情!为什么如果我在文件中使用内联 CSS 或 CSS,如本例中的颜色,结果就不一样! 代码相同,但第一段是绿色,第二段是红色! 我真的不明白为什么? 谢
我目前正在学习 CSS 并进行试验,我偶然发现了输出中的这种差异。所以这是代码: .red-text { color: red;
"""module a.py""" test = "I am test" _test = "I am _test" __test = "I am __test" ============= ~ $ p
在向 Firestore 写入文档时,我经常看到 serverTimestamp() 标记和 new Date() 对象之间的差异不为零。 差异范围从几 秒到几十 分钟。 他们不是在做同样的事情吗?
据我了解,2.675 和 numpy.float64(2.675) 都是相同的数字。然而,round(2.675, 2) 给出 2.67,而 round(np.float64(2.675), 2) 给
问题本身的描述很简单。我正在测试 C++11 中 std::thread 库和 boost::thread 库的区别。 这些的输出: #include #include #include int
我只是想将文本文件读入 pyspark RDD,我注意到 sqlContext.read.load 之间的巨大差异和 sqlContext.read.text . s3_single_file_inp
SC.exe 和 InstallUtil 都可以安装/卸载 Windows 服务。但它们的工作方式似乎并不相同。 有什么区别? 例如,InstallUtil 失败(找不到某些文件或依赖项错误),而 S
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我是一名优秀的程序员,十分优秀!