Git在迭代上游开发中的再基
GitGit在迭代上游开发中的再基,git,rebase,upstream,Git,Rebase,Upstream,Gitrebase对我来说是获取线性历史的好方法,但最近我对它的行为感到有点困惑。情况是,我有我的本地回购、我在GitLab上的原始回购和我课程中的只读上游回购 基本上,TAs在上游回购中发布文档和代码,我将其提取并合并到我的回购中,然后完成实验室。这是一个迭代过程,因为lab2是在我完成lab1并将其推到原点后发布的。在这个迭代中会发生一些令人困惑的事情 lab3发布后,我将master(其中包含我对lab1和lab2的代码)重新设置到upstream/master,结果发现我的提交都集中在g
rebase
对我来说是获取线性历史的好方法,但最近我对它的行为感到有点困惑。情况是,我有我的本地回购、我在GitLab上的原始回购和我课程中的只读上游回购
基本上,TAs在上游回购中发布文档和代码,我将其提取并合并到我的回购中,然后完成实验室。这是一个迭代过程,因为lab2是在我完成lab1并将其推到原点后发布的。在这个迭代中会发生一些令人困惑的事情
lab3发布后,我将master
(其中包含我对lab1和lab2的代码)重新设置到upstream/master
,结果发现我的提交都集中在git历史的最新位置,如:
lab1 TA发布->lab2 TA发布->lab3 TA发布->lab1我的代码(带重基时间)->>lab2我的代码(带重基时间)
我认为是时间展示了我的工作轨迹,所以我想看到的是一段线性历史,如:
lab1 TA发布->lab1我的代码->lab2 TA发布->lab2我的代码->LAB3TA发布
有没有办法实现我的愿望
-----更新-----
例如,现在我已经完成了lab2,lab3已经在上游/master
上发布<代码>lab3 TA发行版不在我的本地主机上(因此我不能简单地使用rebase
来使用我的主机
)。我需要先git-rebase-upstream/master
。就是在这里,my lab2 my code
和lab1 my code
聚集在一起,并随着新的时间而刷新。因此,真正的提交时间(当我完成工作时)消失了,我感到困惑
有没有办法自动保留提交的原始时间(指实时时间)并使其线性化?如果
lab2 TA release
和lab1 my code
提交之间没有冲突,您可以执行git rebase-i HEAD~4
(它不需要是4
,但在您的情况下可能是4)只需更改提交的顺序
例如,当您运行git rebase-i HEAD~4
时,您可能会看到如下内容:
pick <hash4...> Lab 2 released.
pick <hash3...> Lab 1 finished.
pick <hash2...> Lab 2 finished.
pick <hash1...> Lab 3 released.
# Rebase ...
# ...
当您git status
时,您应该会看到以下消息:
On branch temp
Your branch and 'origin/temp' have diverged,
and have n and n different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
因此,当您git push--force
,并且当您git log--pretty=format:“%h%ad |%s%d[%an]”--graph--date=rfc2822
,您应该会看到带有原始时间戳的直接提交历史记录
您还可以查看远程回购的提交时间表,看看它是什么样子。我知道了
$ git checkout -b temp
$ git push -u origin temp
$ git rebase -i HEAD~n # Replace n with an appropriate number and reorder the commits. It should be successful if there isn't any conflict.
我所做的测试都是错误的。我想回答我自己的问题,给路过的人一些信息
假设我已经完成了lab2,并且lab3已经在上游/master
上发布<代码>lab3 TA版本不在我的本地主机上
第一件事是
$ git fetch upstream/master
$ git checkout upstream/master
现在HEAD
已分离,只需运行
$ git rebase master
要将上游/master
重新设置为master
然后,通过创建新的临时分支来保存更改是很重要的,因为HEAD
已分离。如果您只是签出到其他分支,更改就消失了
$ git branch temp
$ git checkout master
$ git merge temp
而合并
将是快进
,一切都安排好了
然后只需按删除分支即可
$ git branch -d temp
您尝试过任何git命令吗?@syohey我尝试过将上游/master重设为master(即反向),但似乎不正确。lab2 TA release
和lab1 my code
之间是否存在冲突?您是否有关于如何在本地克隆中处理分支和提交的具体说明?例如:lab3
的答案必须在原始的lab3版本
提交的基础上提交吗?@LeGEC不,我只希望历史是线性的,并且完全遵循提交时间表。那将是HEAD~4
(或HEAD~n
),而不是HEAD^4
(或HEAD^n
).谢谢你的热情回应!所以关键是首先git-fetch-upstream
和git-rebase-upstream/master
,然后使用interactive-rebase
在本地master上进行提交?但是原始提交的实时性(TAs创建的lab3 TA发布
的时间)将会改变?@Kiyoaki Hi!很抱歉刚才的打字错误!感谢LeGEC指出这一点!我更新了我的答案。如果它仍然不能帮助你完成你想要的东西,我很抱歉。@syohey嗨!我想我找到你了,我知道强制推送是必要的,但关键不是源代码,因为它只是我的在线备份。例如,现在我已经完成了lab2,lab3已经发布,但没有在我的本地主版本中发布(所以我不能简单地求助)。因此,我会git-rebase-upstream/master
首先在lab3-TA-release
中,比如说,master
。就是在这里,我的lab2我的代码
和lab1我的代码
聚集在一起,并随着新的时间而刷新。因此,真正的提交时间(当我完成工作时)消失了,我感到困惑。
$ git branch -d temp