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)
[编辑]这只是部分解决方案/解决方法.请参阅下面的@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)
但这对主人来说很难重置.即它不检查快进.