我们有两个git存储库,包含两个不同但非常相似的项目.
第一个项目是主项目(以下简称MAIN),第二个项目是MAIN(DERIV)的推导.
编辑:请注意,这些不是同一个回购中的不同分支,而是两个单独的回购.在每个回购中,我们只维护一个分支master
.
我们并行处理这两个项目,但基本假设是对MAIN的每次更改也应该应用于DERIV.我们通过发布从MAIN到DERIV的定期拉动来满足这一要求.
问题:
git log
在DERIV中执行时,对于每次提交,我是否可以在添加了哪个存储库的克隆中看到?
编辑:问题是,当两个repos维持一个分支时,这是否可行master
.如果没有,那么问题就变成是否在两个repos中使用不同的分支名称将解决此问题.
我可以找到从MAIN到DERIV的拉动日期吗?
编辑:问题git log
如下:当我在MAIN项目上工作时,我从MAIN repo克隆到本地机器,做一些工作(多次提交),从MAIN拉出并解决冲突(如果有的话),推送到MAIN/master .最后一次提交的消息是Merge branch 'master' of MAIN
.当我从MAIN拉到DERIV并解决冲突时,消息是Merge branch 'master' of MAIN
- 与上面相同.我想在一个克隆中知道哪个repo是上面提到的(合并解析)提交.
谢谢
[编辑:关注更新的问题]
如果您注册了两个遥控器,您可以看到注册了哪些提交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
不是.
[/编辑]
简短回答:
关于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-pick
和rebase
,并尝试手动跟踪哪些提交已被移植,哪些具有不).
还有什么 ?
git fetch / git merge / git pull
绝对是保持两个存储库同步的方法.你需要的是一组分支规则.
也许你只是在某些特定的分支感兴趣MAIN
(master
,release
,...),在其他的(不dev
,test
,tmp
...):你可以配置你的DERIV
资料库默认情况下(只导入一些选定的分支细节在这里).
让本地分支镜像远程分支是很方便的,但也许你不想DERIV:master
被"硬链接" MAIN:master
.
如果要取消master
和origin/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章是关于分支和合并.