我所在的团队中有几个开发人员在Bitbucket上使用Git。我们都在一个开发分支上工作,在发布之前不催促master。

其中一个开发人员提交了错误的代码,不小心覆盖了我自己的代码,现在我正试图将正确的代码推回存储库。我已经阅读了关于这个错误的几天了,我不能再推送到存储库,因为我得到了以下错误:

 ! [rejected]        master -> dev (fetch first)
error: failed to push some refs to 'https://myusername@bitbucket.org/repo_user/repo_name.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我按照说明进行了拖动,但随后收到了合并冲突。在输入合并冲突的消息后,我的本地代码现在是其他开发人员意外上传的错误代码(正如从pull中预期的那样)。因此,我用提交前复制的备份替换了错误的代码,当我再次尝试推送时,我得到了相同的错误。

我该如何解决这个问题?

以下是我为了提交而运行的命令:

git pull remotename master:dev
git add --all
git commit -m "some message"
git pull remotename master:dev
git push remotename master:dev

我本以为,如果我保持这个顺序,就不会收到合并冲突。我想我错了。

我已经在谷歌和Stack Overflow上找了几个小时,并遵循了不同的指示,但我仍然无法将Git推送到开发分支。


当前回答

您可以简单而安全地恢复您的同事所做的更改。使用git revert命令。

git revert commit-hash

使用下面的命令可以找到散列。

git log

它不是理想的恢复提交,事实上,它是一个非常罕见的情况下这样做。经常发生的情况是,开发人员会并发地处理类似的文件,并进行不同的更改。构建Git是为了减少维护健康代码库所需的工作量。

在git的基础上,Github、Atlassian、GitLab等服务提供了方便的界面和功能,可以减少更多类似的问题。 例如,防止直接推送到共享分支,并使用子分支的拉请求代替它们。

如果你的团队缺乏一点组织性。我给你的建议是加快工作速度,在其他人之前推动突破性的变化。(jk)

我的独白已经说够了,当这个问题发生时,我喜欢使用一些方法。

首先,也是最明显的一点,在推动更改之前尝试解决冲突。现在的ide有很好的冲突界面,这是一个关于vs-code的例子。

有几个明显的按钮“接受当前、传入和两者”,可以让你选择想要保留、修改或删除哪段代码。如果您愿意,还可以手动编辑代码!当然没有IDE的同意。

当您的工作正在进行,并且您确实需要您的团队成员所做的更改时,这是非常棒的。或者当你完成工作,只想在第三次加班后上床睡觉前写一份公关报告。

你可以通过cmd做同样的事情,但你可能会在进程结束时结束。

如果你正在开发一个大型功能,并且已经做了很多更改,但你想保持文件未提交,因为有时这样做很方便。藏东西是你的朋友。

git stash > Will temporary store your changes locally until you do a 
git stash pop >  which will retrieve and apply the changes for you.

在存储操作之间拉一个分支不会触发冲突,假设您的分支接近共享的分支。否则,你就回来了 在第一步。

我的第三个也是最后一个小秘密是diff文件。

git checkout -b branch_a
git diff dev..branch_a > changes.diff
git apply changes.diff

它所做的基本上是比较两个分支之间的差异,并创建一个名为changes的文件。Diff将显示您的同事所做的所有更改,并将帮助您决定保留或删除哪些内容

顺便说一句!你可以用merge -abort来取消m

其他回答

我修好了,但我不确定我做了什么。 我试着用:

Git pull <remote> dev . exe 而不是 Git拉<remote> master:dev

你需要输入:

git pull
git fetch 
git merge

如果你使用git push origin master——force,你会遇到一个大问题。

Git pull -rebase origin master Git push origin master


Git push -f origin master

警告git push -f origin master

强制推动现有的存储库,也删除以前的存储库,所以如果你不需要以前的版本,这可能是有帮助的

好吧,实际上github比我们想象的要简单得多,它绝对会发生,每当我们试图推,即使我们显式地插入一些文件在我们的git存储库,所以,为了解决这个问题,简单地尝试..

: git拉

然后. .

:git push

注意:如果你不小心卡在vim编辑器拉你的存储库比不要担心,只是关闭vim编辑器,并尝试推:)

Git pull <remote> master:dev将获取远程/master分支并将其合并到本地/dev分支中。

Git pull <remote> dev将获取远程/dev分支,并将其合并到当前分支中。

我想你说过冲突的提交是在远程/dev上,所以这可能是你想要获取和合并的分支。

在这种情况下,您实际上并没有将冲突合并到本地分支中,这有点奇怪,因为您说您在工作副本中看到了不正确的代码。您可能需要检查remote/master中发生了什么。