1

有时我不想发生的事情发生在我的存储库中。这是我想避免但不知道最佳方法的情况之一:

git init --bare bare.git;
git clone bare.git/ clonned1;
git clone bare.git/ clonned2;
cd clonned1;
REV=1;echo "$REV commit" > $REV.file;git add .;git ci -m "$REV commit";
REV=2;echo "$REV commit" > $REV.file;git add .;git ci -m "$REV commit";
git push;
git co -b new-branch;
REV=3;echo "$REV commit" > $REV.file;git add .;git ci -m "$REV commit";
REV=4;echo "$REV commit" > $REV.file;git add .;git ci -m "$REV commit";
git push -u origin new-branch;
gitk --all;

存储库状态:

在此处输入图像描述

git co master;
git merge --no-ff new-branch;
gitk --all;

存储库状态:

在此处输入图像描述

cd ../clonned2;
git pull;
REV=5;echo "$REV commit" > $REV.file;git add .;git ci -m "$REV commit";
REV=6;echo "$REV commit" > $REV.file;git add .;git ci -m "$REV commit";
git push;
gitk --all;

存储库状态:

在此处输入图像描述

cd ../clonned1;
git pull --rebase;
gitk --all;

存储库状态:

在此处输入图像描述

如您所见,我在 master 分支上丢失了合并提交,这意味着我丢失了项目历史的一部分。当然,愚蠢的我,我忘了推动我的改变。但它不时发生。

如何避免这种情况?如何确保我不会忘记推动?git 有什么方法可以告诉我这个吗?也许我的方法不正确?

4

1 回答 1

0

在这种情况下,在获取最新内容后,我倾向于git reset在 master 上使用:clonned1

git fetch --all
git reset --hard @{u}
git merge new-branch

第一个命令获取所有远程数据。第二个将 master 重置为与远程相同,并从 master 中删除您的提交。最后一个重做合并。

一般来说,任何涉及变基和合并的事情都是可疑的,因为变基会丢弃合并提交。即使git rebase -p是应该保留合并的选项在这里也失败了,因为它会将分支上的提交与它一起变基,使图形看起来像这样:

所以最好的办法是像我上面描述的那样重做合并。

为了帮助我避免这个问题,我做的一件事是在我的提示中加入一些信息。特别是,当有上游集时,我git rev-list --count --right-only @{u}...用来告诉我master在遥控器前面有多远。这最终在我的提示中显示为一个数字,并作为一个提醒推动新修订。

于 2013-04-15T07:59:39.647 回答