找出添加提交的存储库

Vas*_*liy 1 git

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

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

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

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

问题:

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

    编辑:问题是,当两个repos维持一个分支时,这是否可行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).

谢谢

LeG*_*GEC 5

[编辑:关注更新的问题]

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

$ git clone gitserver:deriv.git
$ cd deriv
$ git remote add main gitserver:main.git
$ git fetch main
Run Code Online (Sandbox Code Playgroud)

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

[/编辑]

简短回答:

  1. 不,但可能没关系
  2. 不,但可能没关系

关于git日志:

我假设您DERIV通过运行启动了您的存储库git clone MAIN DERIV,并且您需要一个工作流程,您可以从中拉出MAIN,但从不推送.

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

每次运行git fetch(git pull实际上git fetch都是git merge),您将导入MAIN历史记录DERIV,并且其当前分支将可见并使用origin/前缀标记.

  • 你可以运行git branch -r以查看分支列表MAIN
  • 您可以运行git log origin/branchname以查看branchname开启的历史记录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
Run Code Online (Sandbox Code Playgroud)

您可以在配置文件中将它们添加为快捷方式.

关于谁拉,什么时候

你会看到提交的日期和作者MAIN,你会看到合并的日期和作者DERIV的提交,当会有冲突MAIN.但是你不会确切地知道是谁拉了历史.

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

拉vs樱桃挑选

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

还有什么 ?

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

也许你只是在某些特定的分支感兴趣MAIN(master,release,...),在其他的(不dev,test,tmp...):你可以配置你的DERIV资料库默认情况下(只导入一些选定的分支细节在这里).

让本地分支镜像远程分支是很方便的,但也许你不想DERIV:master被"硬链接" MAIN:master.

如果要取消masterorigin/master,您可以编辑.git/config文件并删除部分[branch "master"].

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

git branch main/v10 --track origin/v10
Run Code Online (Sandbox Code Playgroud)

main/v10将是一个跟踪远程v10分支的本地分支.

结论

如果不指向The Book, git的答案很难完成.花点时间阅读它,它具有很高的relevant explanation / line of text比例.第3章是关于分支和合并.

  • 让我想起[Vicky Pollard](http://www.youtube.com/watch?v=G7rnVWo7SGM)!(对不起,忍不住:) (2认同)