在Git合并冲突之后,我没有触及的很多文件都会变为提交

时间:2012-02-08 08:29:48

标签: git merge

所以我在分支机构工作,进行一些更改,然后运行git merge master。我修改了其中一个文件(我知道如何处理)的合并冲突,但由于某种原因,我做了一堆文件触摸(但是在主版本中更新了)突然输入我的“要做出的改变”清单。

这是为什么?我该如何解决这个问题?我不希望任何这些不通过我的更改得到承诺。

6 个答案:

答案 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):

  

将当前头部称为当前头部,并将头部合并   叫做合并。

     
      
  1. 确定当前和合并的共同祖先。叫它   祖先提交。
  2.   
  3. 处理简单案件。如果祖先提交   等于合并,然后什么都不做。如果祖先提交等于当前,   然后做一个fast forward merge
  4.   
  5. 否则,确定祖先提交和合并之间的更改。
  6.   
  7. 尝试将这些更改合并到当前的文件中。
  8.   
  9. 如果没有冲突,请创建一个新的提交,其中包含两个父项,当前和合并。组   current(和HEAD)指向此新提交,并更新   相应的项目工作文件。
  10.   
  11. 如果存在冲突,请插入适当的冲突标记并通知用户。没有提交   已创建。
  12.   

答案 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

如何处理

方法1

$ 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

方法2

git reset --hard HEAD
git clean -f -d
git pull

这是为什么

我不知道。如果您知道,请鼓励编辑此部分。
我个人本来希望git在中止合并时删除所有新文件。 在上面引用Noufal Ibrahim's answer

  

在源分支中创建具有所有更改的新提交   临时区域。发生冲突时,此更新过程   登台区域被打断,您将获得控制权。这就是为什么   这发生了。