1

我们有两个 git 存储库,其中包含两个不同但非常相似的项目。

第一个项目是主项目(下称MAIN),第二个项目是MAIN(下称DERIV)的派生。

编辑:请注意,这些不是同一个仓库中的不同分支,而是两个独立的仓库。在每个 repo 中,我们只维护一个分支master

我们并行处理这两个项目,但基本假设是对 MAIN 的每次更改也应应用于 DERIV。我们通过发布从 MAIN 到 DERIV 的定期拉取来满足这一点。

问题:

  1. 在 DERIV 中执行git log时,对于每个提交,我可以在它添加的存储库的克隆中看到吗?

    编辑:问题是这是否可行,而两个存储库都维护一个分支master。如果不是,那么问题就变成了在两个 repos 中为分支使用不同的名称是否可以解决这个问题。

  2. 我可以找出从 MAIN 拉到 DERIV 的日期吗?

    编辑:问题git log如下:当我处理 MAIN 项目时,我从 MAIN repo 克隆到本地机器,做一些工作(多次提交),从 MAIN 中提取并解决冲突(如果有),推送到 MAIN/master . 最后一次提交的消息是Merge branch 'master' of MAIN. 当我从 MAIN 拉到 DERIV 并解决冲突时,消息是Merge branch 'master' of MAIN- 与上面相同。我想知道在哪个 repo 的克隆中添加了上述(合并解析)提交。

  3. 我可以看到谁执行了从 MAIN 到 DERIV 的拉动吗?
  4. 您认为从 MAIN 中撤出是最好的方法吗?例如,同样的结果可以通过樱桃采摘(也许还有 rebase)来实现。

谢谢

4

1 回答 1

5

[编辑:以下更新的问题]

如果你注册了两个遥控器,你可以看到哪些提交被注册MAIN,哪些被注册在DERIV.

$ git clone gitserver:deriv.git
$ cd deriv
$ git remote add main gitserver:main.git
$ git fetch main

您应该在本地仓库中看到一个分支main/master,它会告诉您哪些提交是其中的一部分,MAIN哪些不是。

[/编辑]

简短的回答:

  1. 是的
  2. 不,但可能没关系
  3. 不,但可能没关系
  4. 是的

关于 git 日志:

我假设您DERIV通过运行来启动存储库git clone MAIN DERIV,并且您想要一个从中提取MAIN但从不推送的工作流程。

在这种情况下,DERIV存储库“知道” 的存在MAIN,并且 git 命令(主要git fetch)允许您将MAIN的历史记录集成到DERIV.

每次运行git fetch(后面git pull实际上是) 时,都会将的历史导入,它的当前分支将可见并带有前缀标记。git fetchgit mergeMAINDERIVorigin/

  • 您可以运行git branch -r以查看分支列表MAIN
  • 您可以运行git log origin/branchname以查看branchnameon的历史记录MAIN
  • 如果你运行git log --decorate,每个提交都会出现分支名称和指向它的标签
  • 这些注释也将出现在图形工具中,例如gitk

然后,您可以发现项目中的哪些分支DERIV集成了MAIN项目中的更改。

如果您在DERIV跟踪分支中有一些分支MAIN(这是 的默认行为master),git status如果DERIV' 的分支缺少来自MAIN' 的分支的提交,则会通知您。

如果你主要使用命令行,有两个命令非常方便:

git log --graph --decorate --pretty=oneline --abbrev-commit
git log --graph --decorate --pretty=oneline --abbrev-commit --all

您可以将它们作为快捷方式添加到您的配置文件中。

关于谁拉了,什么时候拉的

您将看到 的提交的日期和作者MAIN,您将在 的提交中看到合并的日期和作者DERIV,当与MAIN. 不过,您不会确切地看到是谁拉动了历史。

git fetch实际上是一个(几乎)无害的命令,它将 importMAIN的历史记录而不干扰DERIV分支(它向您的存储库添加一堆提交,并移动所有origin/*导入的分支)。

拉取与樱桃采摘

跟踪分支头之间的差异(具有跟踪和合并分支git的所有内部机制)比尝试手动实现相同的结果(例如:使用and ,并尝试手动跟踪哪些提交已被移植以及哪些已被移植)更容易不是)。cherry-pickrebase

还有什么 ?

git fetch / git merge / git pull绝对是使两个存储库保持同步的方法。您需要的是一组分支规则。

也许您只对 ( , , ...) 的某些特定分支感兴趣,而对其他分支MAIN( master, , release...) 不感兴趣:您可以将存储库配置为默认仅导入某些选定的分支(此处有详细信息)。devtesttmpDERIV

让本地分支镜像远程分支很方便,但也许您不想DERIV:master被“硬链接”到MAIN:master.

如果要取消链接masterand origin/master,可以编辑.git/config文件并删除该部分[branch "master"]

如果您想创建一个本地分支来跟踪具有不同名称的远程分支,您可以运行:

git branch main/v10 --track origin/v10

main/v10将是一个本地分支,它跟踪远程v10分支。

结论

没有指向The Book的 git 答案很少是完整的。花点时间阅读它,它的relevant explanation / line of text比例非常高。第 3 章是关于分支和合并的。

于 2013-06-28T16:10:56.403 回答