所以我在分支机构工作,进行一些更改,然后运行git merge master
。我修改了其中一个文件(我知道如何处理)的合并冲突,但由于某种原因,我做了一堆文件不触摸(但是在主版本中更新了)突然输入我的“要做出的改变”清单。
这是为什么?我该如何解决这个问题?我不希望任何这些不通过我的更改得到承诺。
答案 0 :(得分:4)
我认为这种GIT做事方式的问题在于提交之后,"推送"将被执行。 "推"将包括所有提交的文件 - 包括" pusher"没碰过。这使得跟踪变得非常复杂。
答案 1 :(得分:4)
发生这种情况的原因是因为你很可能与你打算做的相反。
假设您的工作分支被称为topic-branch
。
而不是:
$ git merge master
$ git checkout master
$ git merge topic-branch
在英语中,您可以将master
合并到topic-branch
,而不是将topic-branch
分支合并到master
。
为了理解为什么这会达到预期的结果,我们可以检查先前答案中的陈述:
尝试合并时,所有可以自动合并的文件 (例如,您的本地分支机构没有任何变更,但哪些变更 已在源分支上修改,自动合并并暂存。
您遇到的问题只是merge
试图完成其工作。您的主题分支中的文件不会更改,但它们位于您要合并到其中的分支上。如果你在将topic-branch
合并到master
的相反方向看这个问题就会消失,因为它只会考虑你修改过的文件。
从概念上讲,这是合并正在做的事情(更多here):
将当前头部称为当前头部,并将头部合并 叫做合并。
- 确定当前和合并的共同祖先。叫它 祖先提交。
- 处理简单案件。如果祖先提交 等于合并,然后什么都不做。如果祖先提交等于当前, 然后做一个fast forward merge。
- 否则,确定祖先提交和合并之间的更改。
- 尝试将这些更改合并到当前的文件中。
- 如果没有冲突,请创建一个新的提交,其中包含两个父项,当前和合并。组 current(和HEAD)指向此新提交,并更新 相应的项目工作文件。
- 如果存在冲突,请插入适当的冲突标记并通知用户。没有提交 已创建。
醇>
答案 2 :(得分:1)
当您尝试合并时,所有可以自动合并的文件(例如,您在本地分支中没有任何更改但在源分支上已经修改的文件)会自动合并并暂存。无法自动合并的文件会在您的工作区域中使用冲突标记进行更新,您必须修复它们。
Git总是在提交之前在临时区域中组装新的提交。合并做同样的事情。在暂存区域中创建一个包含源分支的所有更改的新提交。如果发生冲突,更新暂存区域的过程将被中断并给予控制权。这就是为什么会发生这种情况。提交后,将在存储库中创建“合并提交”,其中源和目标分支都作为父级。
至于“我不希望任何这些不通过我的更改得到承诺。”,如果您不想要任何更改,为什么要进行合并呢?
答案 3 :(得分:0)
我自己遇到了同样的问题,并想出了一个中间解决方案。需要在未来找到一个更好的。
首先要解决@NoufalIbrahim提出的问题:至于“我不希望任何这些不通过我的更改得到承诺。”,如果你不想要,你为什么要进行合并?有什么变化吗?
你误解了@grautur的意图。需要进行更改,但不是新提交的一部分。例如,本地添加了1个文件,100个文件来自合并。新提交应该有1个已更改的文件而不是101更改的文件。如果无法进行自动合并,则启动拉取请求并且有人必须查看提交,这一点尤为重要。您希望审阅者查看1个文件,而不是101个文件。
我目前正在做的是:假设我们有分支'主'和'功能'。 'feature'是从'master'创建的,我只对'feature'中的文件进行了更改。当新的更改被拉入'master'时,'feature'中的git merge master
将引入新文件(这些文件会在VSCode中自动暂存,这是我使用的IDE。)
我接下来要做的就是取消所有这些文件。基本上忽略它们。只添加和提交我更改的文件。将“feature”推送到origin / remote repo,创建pull请求。当接受请求并将提交合并到主分支时,在本地和远程删除“功能”。将更改拉到“主”本地并创建一个新分支以处理新功能。这个新分支不会有一堆非分页文件。
可以使用git命令告诉git在不使用.gitignore的情况下忽略一堆文件。进一步研究这个。
答案 4 :(得分:0)
如果我出现,我会在弹出窗口中找到
:1)创建并在分支(b1)上工作
---m
\
b1
---m
\
---b1
2)从b1创建一个新分支(b2),在此期间其他人对master中完全不相关的代码进行了更改
----------------m
\
---b1
\
b2
3)返回并对b1进行一些更改,然后将b1拉入master。
----------------m
\ /
-------b1
\
--b2
如果我随后尝试从master拖入b2,则由于创建b2之后对b1所做的更改,我将发生冲突。如果我解决了冲突,那么提交的结果将包括自b1分支以来在master上发生的所有更改,就像我执行了它们一样。 (git blame
似乎可以告诉原始作者)
在这种情况下,如果我改为先从b1拉入b2,然后在那里进行合并整理,那么我就可以从master拉出而没有问题,并且引入的无关提交不会显示为更改,已经完成。
git merge --abort
是您的朋友,如果您正在合并没有提交的提交,那么请注意。
答案 5 :(得分:0)
正在使用Word文件导致合并失败。重现此问题的方法如下:
创建一个仓库setLimit(limit){
this.maxLimitMessage=false;
if(limit>=101)
this.maxLimitMessage=true;
this.toastsManager.error("max limit cannot be more than 100",limit, this.limit);
this.limit=100;
return;
}
this.toastsManager.error('vbnm')
this.limit = limit;
}
:
a
创建mkdir a
cd a
git init
并保存,然后继续
a/alpha.docx
创建具有git add alpha.docx
git commit -m "initial alpha commit"
作为远程仓库的仓库b
:
a
修改cd ..
mkdir b
cd b
git clone ../a
并保存,然后继续
a/alpha.docx
用文字打开cd ../a
touch beta # create some file
git commit -am "modified alpha"
,然后开始输入内容。不要保存它。这会将文件标记为忙。
b/alpha.docx
这将创建文件cd ../b
git pull
,然后中止合并并出现以下错误:
b/beta
如果您现在尝试在关闭单词并放弃本地更改后再次拉动,则会发生这种情况:
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /cygdrive/c/tmp2/b/../a
a797c43..5c6796e master -> origin/master
Updating a797c43..5c6796e
error: unable to unlink old 'alpha.docx': Device or resource busy
$ git pull
Updating a797c43..5c6796e
error: The following untracked working tree files would be overwritten by merge:
beta
Please move or remove them before you merge.
Aborting
根据建议here
git reset --hard HEAD
git clean -f -d
git pull
我不知道。如果您您知道,请鼓励编辑此部分。
我个人本来希望git在中止合并时删除所有新文件。
在上面引用Noufal Ibrahim's answer:
在源分支中创建具有所有更改的新提交 临时区域。发生冲突时,此更新过程 登台区域被打断,您将获得控制权。这就是为什么 这发生了。