【问题标题】:Why is git removing rows that were added on one branch when merging?为什么 git 会在合并时删除在一个分支上添加的行?
【发布时间】:2013-12-03 06:00:06
【问题描述】:

我正在使用 git 来跟踪我的一个小型网站的开发。我目前有两个分支:

  1. master 分支,其代码(据说)已准备好部署
  2. dev 分支,我会在其中尝试直到我认为它们已准备好部署

为了养成良好的习惯,以便将开发升级到更多人,我通常将master 分支与dev 分支合并,然后检查master 分支并将dev 合并到其中– 以便能够解决 dev 分支而不是 master 中的任何冲突。

上次我这样做时,一些代码就消失了(id="all_text" 的 css 代码,请参阅下面的代码)。我认为这是因为 master 分支中没有代码,并且因为我将 master 代码移动到 dev 分支中(但这不是我记得它的行为方式),所以我取消了合并( git reset --merge;我在 git 1.7.0.3),检查了 master 分支并将其与 dev 分支合并。结果相同——#all_text css 中的大部分代码都消失了。

我不知道为什么会这样。最新的更改在 dev 分支上,因此它们应该合理地在合并中进行,而不是被删除。

有没有什么办法可以解决这个问题,而无需手动将dev 中的文档内容复制到master

开发内容(index.css)

body {
    margin:0;
    padding:0;
}

/* attributes for the <div> that encapsules the h1 and the encouragement */

#all_text {
    position: relative;
    height: 50%;
    width: 70%;
    margin-top:8em;
    margin-left:auto;
    margin-right:auto;
    text-align: center;

//  background-color: yellow; // Trace code to better see the design
}

h1 {
    position: relative;
    text-align: center;

    font-size: 700%;
    color: #4970A8;
/*  color: #5AA0FF; */
    text-shadow: 4px 4px 8px gray;

//  background-color: green; // Trace code to better see the design
}

div.encouragement {
    position: relative;
    width: 70%;
    bottom: 25px;

    color: #4970A8;
    font-size: 170%;

//  background-color: red; // Trace code to better see the design
}

主内容(index.css)

#all_text {
    position: relative;
}

h1 {
    color: #4970A8;
/*  color: #5AA0FF; */
    text-align: center;
/*  text-vertica-align: center; */
    font-size: 700%;
    position: relative;
    top:30%;

    text-shadow: 4px 4px 8px gray;
}

div.encouragement {
    color: #4970A8;
    text-align: center;
    font-size: 150%;
/*  position: absolute;
    top: 5%m;
    left:7%em; */
/*  text-shadow: 2px 2px 8px gray; */
}

合并的内容 (index.css)

#all_text {
    position: relative;
}

h1 {
<<<<<<< HEAD
    position: relative;
    text-align: center;

    font-size: 700%;
    color: #4970A8;
/*  color: #5AA0FF; */
    text-shadow: 4px 4px 8px gray;

//  background-color: green; // Trace code to better see the design
}

div.encouragement {
    position: relative;
    width: 70%;
    bottom: 25px;

    color: #4970A8;
    font-size: 170%;

//  background-color: red; // Trace code to better see the design
=======
    color: #4970A8;
/*  color: #5AA0FF; */
    text-align: center;
/*  text-vertica-align: center; */
    font-size: 700%;
    position: relative;
    top:30%;

    text-shadow: 4px 4px 8px gray;
}

div.encouragement {
    color: #4970A8;
    text-align: center;
    font-size: 150%;
/*  position: absolute;
    top: 5%m;
    left:7%em; */
/*  text-shadow: 2px 2px 8px gray; */
>>>>>>> master
}

#all_text{…} 部分中的大部分文本发生了什么变化?

先谢谢了。


更新:添加了merge-base(根据dyng’s指令)。

运行git show $(git merge-base dev master) 给了我这个:

diff --git a/www/index.css b/www/index.css
index b837a87..d8c48ef 100644
--- a/www/index.css
+++ b/www/index.css
@@ -1,25 +1,44 @@
+body {
+       margin:0;
+       padding:0;
+}
+
+/* attributes for the <div> that encapsules the h1 and the encouragement */
 #all_text {
        position: relative;
+       height: 50%;
+       width: 70%;
+       margin-top:8em;
+       margin-left:auto;
+       margin-right:auto;
+       text-align: center;
+               
+//     background-color: yellow; // Trace code to better see the design
 }

+
 h1 {
        color: #4970A8;
 /*     color: #5AA0FF; */
        text-align: center;
-/*     text-vertica-align: center; */
+       display: inline-block;
        font-size: 700%;
        position: relative;
-       top:30%;
+       left:0.5em;
+

        text-shadow: 4px 4px 8px gray;
+               
+//     background-color: green; // Trace code to better see the design
 }

-div.encouragement {
+span.encouragement {
        color: #4970A8;
-       text-align: center;
-       font-size: 150%;
-/*     position: absolute;
-       top: 5%m;
-       left:7%em; */
-/*     text-shadow: 2px 2px 8px gray; */
+       font-size: 170%;
+       position: relative;
+       top: 3em;
+       right:18em; 
+
+
+//     background-color: red; // Trace code to better see the design
 }
\ No newline at end of file

【问题讨论】:

  • git merge-base dev master 将在合并devmaster 时告诉合并基础(这是一个提交),index.css 在那个提交中看起来像什么? (这里是一行命令:git show $(git merge-base dev master):/path/to/index.css
  • 感谢您提供有关如何操作的明确说明,请参阅上面的更新以获取结果。 (我在没有路径规范的情况下运行它,因为当我包含路径时它给出了一个致命错误,但我在上面的更新中遗漏了其他文件。)我在 dev 分支中运行它。据我了解,+'es 告诉我与 master 分支相比,在 dev 分支中添加了哪些行(以及 -'es 已删除的内容),但我不太确定如何处理该信息– 我已经知道我想保留什么,但 git 不知道 ;) ).
  • @dyng 也许我对 VonC 的评论也有帮助(事实上我更新了服务器端的东西并在 dev 分支上进行单独开发时将其获取到 master)。但这并不能解释为什么 git 会丢弃我在 dev 分支中添加的主体选择器(例如)。
  • 合并基础信息意味着在 master 分支中,添加了“all_text”中的行然后删除。虽然 dev 与 merge-base 保持一致,但在 master 中这些行已被删除。在合并期间,如果一个分支与合并基础不同而另一个保持不变,Git 将始终接受更改的分支作为合并结果。

标签: git merge merge-conflict-resolution


【解决方案1】:

我直接在服务器上撤消了最后一次提交(最后一次推送),然后将其提取/拉到本地主机。

这是解决问题的关键。通过

恢复master中的提交
git checkout master
git revert <sha1_of_that_commit>

然后合并就可以正常工作了。

但正如 VonC 所说,将 master 合并/拉到 dev 并不是一个好主意,git rebasegit pull --rebase 应该更好。

【讨论】:

  • 我同意。 +1。但正如我在回答中所说,我更喜欢在推动之前先拉动(和变基)。先推可能……很危险;)imgur.com/nDNPyYd
  • 嗯……我首先只检查了 css 文件,看看它是我正在检查的正确提交,但后来我有点陷入其中并与 dev 合并而不是恢复到首先关联的提交。这产生了一个合并冲突,我通过简单地粘贴 index.css 的最实际版本并提交来解决。这给出了“您的分支比 'origin/master' 领先 8 次提交。”运行 git status 时评论。我试图通过将 master 恢复到早期阶段然后合并来摆脱它(如上面 dyng 所建议的那样)但是......
  • ... 这给了我一个致命错误“致命:提交 db6ebec56b1e4f1650dbb8b5a9bedaf057c6e400 是一个合并,但没有给出 -m 选项。”所以我尝试了一个不是合并的较早提交点,这给了我“完成一个还原。错误:编辑器'vi'有问题。请使用 -m 或 -F 选项提供消息。”。据我所知,这是成功的,但也许它失败了缺少提交评论的 b/c?无论如何,当我运行“git merge dev”时,我收到了“Already up-to-date”的消息……
  • ... 从那时起,每当我从 dev 切换到 master 时,我都会得到“你的分支比 'origin/master' 领先 2 次提交。”,我不明白——据我所知我 am 在 master 分支上,那我怎么能领先它呢?从这个角度来看,在 dev 中存在尚未在 master 中的更改是有道理的,但这应该合理地意味着“您的分支在 origin/master 之前......”应该在我检查 dev 时出现,但它没有(仅当我签出主人时)。很抱歉我把这件事搞砸了,我感谢你的帮助 dyng 和 VonC。如何摆脱“你的分支在前面……”?
  • @EliasMossholm 您误用了 revertgit revert 是一个令人困惑的命令,它与 svn 同名,但含义完全不同。 svnrevert 的真正对应物是git reset.
【解决方案2】:

我通常会先将 master 分支与 dev 分支合并,然后再检出 master 分支并将 dev 分支合并到其中

为了避免这些合并问题,最好:

  • rebase 在 master 之上开发
  • 在将 dev 合并到 master 之前

这样,您可以在 master 之上重新应用(rebase)您的更改,从而使您的 dev 代码不太可能“消失”。

【讨论】:

  • 一旦扩展到更多用户,这会起作用吗?或者我会覆盖其他人合并到 master 中的任何内容?
  • @EliasMossholm 是的,它会起作用的。只要您首先在最新的 master 之上进行 rebase,然后再推送,您就不会覆盖任何内容。
  • 我试过了,但仍然丢失了一些我想保留的代码(例如,开发分支版本顶部的“body”部分)。我也遇到了需要解决的冲突,所以我中止了 rebase 操作,但感谢您的努力/提示。
  • 问题可能是在我最后一次推送到服务器之后,页面在移动浏览器中看起来很奇怪所以我直接在服务器上取消了最后一次提交(最后一次推送)然后获取/把它拉到本地主人那里(如果我没记错的话)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2015-12-22
  • 2016-04-14
  • 2020-11-13
  • 2017-02-12
  • 2021-06-27
相关资源
最近更新 更多