Git在迭代上游开发中的再基

Git在迭代上游开发中的再基,git,rebase,upstream,Git,Rebase,Upstream,Gitrebase对我来说是获取线性历史的好方法,但最近我对它的行为感到有点困惑。情况是,我有我的本地回购、我在GitLab上的原始回购和我课程中的只读上游回购 基本上,TAs在上游回购中发布文档和代码,我将其提取并合并到我的回购中,然后完成实验室。这是一个迭代过程,因为lab2是在我完成lab1并将其推到原点后发布的。在这个迭代中会发生一些令人困惑的事情 lab3发布后,我将master(其中包含我对lab1和lab2的代码)重新设置到upstream/master,结果发现我的提交都集中在g

Git
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