找出添加提交的存储库

时间:2013-06-28 15:51:55

标签: git

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

第一个项目是主项目(以下简称MAIN),第二个项目是MAIN(DERIV)的推导。

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

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

问题:

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

    编辑: 问题是,当两个repos维护单个分支master时,这是否可行。如果没有,那么问题就变成是否在两个回购中为分支使用不同的名称将解决这个问题。

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

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

  3. 我可以看看谁从MAIN到DERIV进行了拉动吗?
  4. 你认为从MAIN拉出是最好的方法吗?例如,樱桃采摘可以实现相同的结果(也许,可能是rebase)。
  5. 由于

1 个答案:

答案 0 :(得分: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. 关于git log:

    我假设您通过运行DERIV启动了git clone MAIN DERIV存储库,并且您需要一个工作流程,从MAIN开始,但从不推送。

    在这种情况下,DERIV存储库“意识到”MAIN的存在,而git命令(主要是git fetch)允许您集成MAIN的历史记录为DERIV

    每次您运行git fetchgit pull实际为git fetch后跟git merge),您都会将MAIN的历史记录导入DERIV },及其当前分支将可见,并使用origin/前缀标记。

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

    然后,您可以发现MAIN项目中哪些分支已整合DERIV项目中的更改。

    如果MAINmaster跟踪分支中有一些分支(这是[{1}}的默认行为),git status会通知您DERIV的分支缺少来自MAIN分支的提交。

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

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

    你可以add them as shortcuts in your config file

    关于谁拉,

    您将看到MAIN提交的日期和作者,当与DERIV发生冲突时,您会在MAIN的提交中看到合并的日期和作者。你不会看到究竟是谁拉过了历史。

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

    pull vs cherry-pick

    跟踪分支头之间的差异更容易(git具有跟踪和合并分支的所有内部机制),而不是试图手动获得相同的结果(例如:using { {1}}和cherry-pick,并尝试手动跟踪哪些提交已被移植,哪些没有。)

    还有什么?

    rebase绝对是保持两个存储库同步的方法。您需要的是分支的一组规则。

    也许您只对git fetch / git merge / git pullMAINmaster,...)的某些特定分支感兴趣,而不是其他分支(release,{{1 },dev ...):您可以将test存储库配置为默认导入一些选定的分支(details here)。

    让本地分支镜像远程分支是很方便的,但也许你不希望tmpDERIV“硬链接”。

    如果您要取消关联DERIV:masterMAIN:master,可以修改master文件并删除origin/master部分。

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

    .git/config

    [branch "master"]将是一个本地分支,用于跟踪远程git branch main/v10 --track origin/v10 分支。

    <强>结论

    如果没有指向The Book,git答案很难完成。花点时间阅读它,它具有非常高的main/v10比率。 Chapter 3是关于分支和合并的。