2

Gitrebase对我来说是获取线性历史记录的好方法,但最近我对它的行为有点困惑。情况是我有本地仓库、GitLab 上的原始仓库和课程的只读上游仓库。

基本上 TA 在上游 repo 中发布文档和代码,我获取它并合并到我的 repo 中,然后完成实验室。这是一个迭代的过程,因为lab2是在我完成lab1并push到origin之后发布的。在这个迭代中发生了令人困惑的事情。

在 lab3 发布后,我将master(其中包含我的 lab1 和 lab2 的代码)重新定位到upstream/master,却发现我的提交都聚集在 git 历史的最新位置,例如:

lab1-TA-release -> lab2-TA-release -> lab3-TA-release -> lab1-my-code(有变基时间)-> lab2-my-code(有变基时间)

我认为是提交时间显示了我的工作轨迹,所以我希望看到的是线性历史,例如:

lab1-TA-release -> lab1-my-code -> lab2-TA-release -> lab2-my-code -> lab3-TA-release

有什么办法可以实现我的愿望吗?

- - -更新 - - -

例如,现在我已经完成了 lab2,lab3 已经发布在upstream/master. lab3-TA-release不在我当地的主人身上(所以我不能简单地使用rebase我的master)。我需要git rebase upstream/master先。正是在这里,人们my lab2-my-code聚集lab1-my-code在一起,所有人都在新的时间里焕然一新。所以真正的提交时间(当我完成工作时)消失了,我很困惑。

有没有办法自动保留提交的原始时间(意味着实时)并使其线性化?

4

2 回答 2

1

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 ...
# ...

然后你可以简单地通过剪切和粘贴来切换顺序:

pick <hash3...> Lab 1 finished.
pick <hash4...> Lab 2 released.
pick <hash2...> Lab 2 finished.
pick <hash1...> Lab 3 released.

# Rebase ...
# ...

我认为,如果您只关心本地 repo 的提交时间线,那么它应该保留重新排序后提交的原始时间。

但是,当您要将更改推送到远程仓库时,您可能必须这样做git push --force,否则您可能会git pull在推送新更改之前先被要求,这可能不是您想要的,因为您似乎想要本地提交时间线看起来很直,在您的提交历史图表中没有发生任何合并?

只是当你 时git push --force,它不会改变本地提交的原始时间,而是将远程仓库中提交的时间更改为你推送的时间。

也许您可以尝试创建一个临时分支并对其进行测试以查看它的外观。

$ 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.

当你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,你应该看到带有原始时间戳的直接提交历史。

您还可以查看远程仓库的提交时间线,看​​看它是什么样子的。

于 2020-11-26T07:01:10.817 回答
0

我知道了!

我所做的测试都在错误的方向。我想回答我自己的问题,并给任何路过的人一些信息。

假设我已经完成了lab2,lab3已经发布了upstream/masterlab3-TA-release不在我当地的主人身上。

第一件事是

$ git fetch upstream/master
$ git checkout upstream/master

而现在HEAD是分离的,只需运行

$ git rebase master

到. rebase upstream/master_master

然后通过创建一个新的临时分支来保存更改很重要,因为HEAD它是分离的。如果您只是结帐到其他分支,则更改将消失。

$ git branch temp
$ git checkout master
$ git merge temp

并且merge将是fast-forward,一切就绪。

然后只需删除temp分支

$ git branch -d temp
于 2020-11-27T04:28:24.263 回答