我们有两个git存储库,包含两个截然不同但非常相似的项目。
第一个项目是主项目(以下简称MAIN),第二个项目是MAIN(DERIV)的推导。
编辑:
请注意,这些在同一个仓库中不是不同的分支,而是两个单独的回购。在每个仓库中,我们只维护一个分支master
。
我们并行处理这两个项目,但基本假设是对MAIN的每次更改也应该应用于DERIV。我们通过发布从MAIN到DERIV的定期拉动来满足这一要求。
问题:
在DERIV中执行git log
时,对于每次提交,我是否可以在添加了哪个存储库的克隆中看到它?
编辑:
问题是,当两个repos维护单个分支master
时,这是否可行。如果没有,那么问题就变成是否在两个回购中为分支使用不同的名称将解决这个问题。
我可以找出从MAIN到DERIV的拉动日期吗?
编辑:
git log
的问题如下:当我处理MAIN项目时,我从MAIN repo克隆到本地机器,做一些工作(多次提交),从MAIN拉出并解决冲突(如果有的话),推送到主/主。最后一次提交的消息是Merge branch 'master' of MAIN
。
当我从MAIN拉到DERIV并解决冲突时,消息为Merge branch 'master' of MAIN
- 与上面相同。
我想在一个克隆中知道哪个repo是上面提到的(合并解析)提交。
由于
答案 0 :(得分:5)
[编辑:关注更新的问题]
如果您同时注册两个遥控器,则可以查看哪些提交已在MAIN
上注册,哪些已在DERIV
上注册。
$ git clone gitserver:deriv.git
$ cd deriv
$ git remote add main gitserver:main.git
$ git fetch main
您应该在本地仓库中看到一个分支main/master
,它会告诉您哪些提交是MAIN
的一部分,哪些不是。
[/编辑]
简短回答:
关于git log:
我假设您通过运行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
跟踪分支中有一些分支(这是[{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 pull
(MAIN
,master
,...)的某些特定分支感兴趣,而不是其他分支(release
,{{1 },dev
...):您可以将test
存储库配置为默认导入一些选定的分支(details here)。
让本地分支镜像远程分支是很方便的,但也许你不希望tmp
与DERIV
“硬链接”。
如果您要取消关联DERIV:master
和MAIN:master
,可以修改master
文件并删除origin/master
部分。
如果要创建一个跟踪具有不同名称的远程分支的本地分支,可以运行:
.git/config
[branch "master"]
将是一个本地分支,用于跟踪远程git branch main/v10 --track origin/v10
分支。
<强>结论强>
如果没有指向The Book,git答案很难完成。花点时间阅读它,它具有非常高的main/v10
比率。 Chapter 3是关于分支和合并的。