我有一个简单的场景。我已经在本地提交了更改,现在我想将远程(在我前面的一个分支)中的内容合并到本地工作目录中。
git branch -vv --list --all
提供以下内容:
master 79d9d4e [origin/master: behind 7] Footprint UI working
remotes/origin/HEAD -> origin/master
remotes/origin/master a86a1a9 Added sample data to webpage
我特别想合并一个文件。这是差异:
git diff --stat a86a1a9 79d9d4e views/footprint.handlebars
views/footprint.handlebars | 65 +++++++++++++++++++++++++++++++++--------------------------------
1 file changed, 33 insertions(+), 32 deletions(-)
但是当我运行git pull
时,本地提交中的文件版本将被远程版本覆盖。更详细地说:
$ git fetch -v origin
From github.com:githubusername/foo
= [up to date] master -> origin/master
$ git merge origin
Updating 79d9d4e..a86a1a9
Fast-forward
...
views/footprint.handlebars | 65 ++++++++++++++++++++++++++++++++---------------------------------
...
6 files changed, 220 insertions(+), 59 deletions(-)
create mode 100644 static/search.js
create mode 100644 views/search.handlebars
我已经阅读了以下帖子:
并尝试了以下命令:
git pull --rebase
覆盖文件的本地版本git merge -s recursive -X ours
覆盖文件的本地版本git merge -s ours
提示输入提交消息,然后覆盖远程更改git rebase remotes/origin/master
说它将“重播”我的作品,但仍会覆盖它git merge --no-ff --no-commit
从字面上报告“自动合并进行得很好;在按要求提交之前已停止” (运行上述各项后,我检查了相关文件,并注意到该文件已被覆盖,并运行git reset --hard master@{"5 minutes ago"}
)
$ git config --list
redential.helper=osxkeychain
user.name=My Name
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.precomposeunicode=true
remote.origin.url=git@github.com:githubusername/foo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
user.email=email@address.com
remote.heroku.url=https://git.heroku.com/foo.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
$ git log --oneline --decorate --simplify-by-decoration --all -10
a86a1a9 (origin/master, origin/HEAD) Added sample data to webpage
79d9d4e (HEAD -> master) Footprint UI working
c53160d Initial commit
$git log --format="%h %ci %cn" views/footprint.handlebars
79d9d4e 2019-03-12 19:04:08 -0400 chb
fada3fa 2019-03-10 13:59:41 -0700 JA
9641499 2019-03-08 16:48:14 -0800 JA
1759509 2019-03-08 12:32:08 -0800 GitHub
bfe443e 2019-03-07 16:41:18 -0800 JA
git version 2.17.2 (Apple Git-113)
为什么git
不会这样标记冲突,而是将适当的标记(<<<<<<< HEAD
,=======
,>>>>>>>
)添加到相关文件中? / p>
答案 0 :(得分:8)
我怀疑对合并应该做什么的误解。 (注意重点,与我同在)
如果有的话,让我们清理一下。
我们最好将重点放在文件views/footprint.handlebars
上。在初始提交和本地提交之间是否进行了更改?在初始提交和origin/master
之间?都是吗?
如果您没有更改它,那么合并后的文件反映了它们的更改是可以预料的。
如果他们没有更改它,并且更改后的版本在合并后的最初提交中被“较旧”版本覆盖,那么这是一种奇怪的行为。
如果您和他们俩都对文件进行了更改,但是在不同且无冲突的地方,则最终结果应包含双方的更改,并且没有冲突。我不会称其为“覆盖”。
最后,如果您实际上想将此文件保持在您最近的本地提交中的确切状态,则必须像您暗示的那样非常繁琐的事情那样使合并冲突,但这不是很大:
git checkout master
git fetch
git merge --no-commit origin/master
git checkout HEAD -- views/footprint.handlebars
git commit -am "Kept file views/footprint.handlebars as per commit 79d9d4e"
请给我们更多反馈,我将进行调整。 (不过可能是明天;-)
在评论后添加:
我非常同意Useless在below下的评论。我并没有从您最初的问题中得到答案,即您与同事的提交(在您添加here之前)之间在文件中反复出现 。
现在,恢复所需更改及其更改的解决方案可能是检查文件历史记录,然后从初始共享状态仔细重建内容,但是根据您的上下文,很难建议最佳公式。如果同事可以与您一起解决问题,您很可能会避免很多麻烦。
附加语:
对不起,我的结局很痛苦,我完全理解您会更喜欢在智力上令人满意的答案/解决方案。我感谢您的赏赐,感谢所有其他有见地的评论。