Git结帐并合并而不触及工作树

23 git

假设我有一个功能分支,在推送我的更改之前我将上游更改合并到其中:

git branch feature1
... [edit my code]
... [commit]
git fetch origin master
git merge fetch_head [or rebase]
... [resolve conflicts]
... [build and test code]
Run Code Online (Sandbox Code Playgroud)

在这一点上,我希望推动我的改变.这样做的正常方法是:

git checkout master [changes a bunch of working tree files]
git merge feature1  [changes the same files right back]
Run Code Online (Sandbox Code Playgroud)

这工作正常,但会使(日期检查)编译器认为一大堆文件是脏的,即使内容相同也需要重建.在这种情况下,有没有办法结帐并使工作树保持不变?

就像是:

git checkout master --merge-branch feature1
Run Code Online (Sandbox Code Playgroud)

编辑:

我只谈论快速合并,根据定义,它不会改变文件的状态.

小智 41

一个简单而安全的方法 - 无需推送或强制更新 - 将feature1提取到master中:

(feature1)$ git fetch . feature1:master
From .
   4a6000d..8675309  feature1   -> master
Run Code Online (Sandbox Code Playgroud)

诀窍是使用.获取本地 feature1引用.这比强制更新主分支更安全,因为它确保更新是快进的.(有关详细信息,请参阅git-fetch文档中的<refspec>参数.)

现在feature1和master是相同的,它们之间的切换不会触及任何文件:

(feature1)$ git checkout master
Switched to branch 'master'
(master)$
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.我会在各种情况下继续回到它:) (4认同)

Jas*_*oof 8

[编辑]这只是部分解决方案/解决方法.请参阅下面的@djpohly的实际答案.

首先,你可以从任何地方推送.无论你检查了什么,或者你想要推送的提交是否在主人.

git push REMOTE_REPO feature1:master
Run Code Online (Sandbox Code Playgroud)

看到 git help push

暗示: git push remoteRepo localRef:remoteRef

至于把大师带到你现在的位置,而不是摆弄你的工作副本......你可以这样强制它:

# (while still on feature1 branch)
git checkout -B master origin/master
Run Code Online (Sandbox Code Playgroud)

但这对主人来说很难重置.即它不检查快进.

  • 也许你想在你的计算机上安装另一个克隆,这样你就可以同时检查出来?如果您关心空间,可以让两个本地克隆共享存储空间. (2认同)
  • 我想我希望对于快进合并,git能够在不触及任何文件的情况下进行结账和合并(因为根据定义它们都不会改变).这不是什么大不了的事,只是一个小小的不便. (2认同)