常用Git命令
常用Git命令
1. 基本Git操作指令
1.1 创建仓库
1 | # 将当前目录初始化为 Git 仓库 |
1.2 查看仓库配置
Git 配置分为全局配置、以及各个仓库自己的局部配置,仓库的局部配置会与全局配置合并去重,重复的配置项以仓库局部配置为准。
1 | # 查看全局 Git 配置 |
1.3 分支管理
1 | # 从远程连接仓库拉取最新数据到本地仓库 |
1.4 提交变更
1 | # 将改动文件提交到暂存区 |
1.5 其他命令
1 | Search branch name containing commit hash, and filter with text. |
2. 常见的跨仓库设置
2.1 同时Push到多个仓库
通过 git remote -v
可以查看当前仓库拉取(fetch)和推送(push)的远程仓库的链接:
1 | origin https://XXX.git (fetch) |
如果想同时 Push 到多个仓库可以通过如下方式添加多个目标仓库地址:
1 | git remote set-url --add [name] [url] |
其中,[name]
对应的是远程仓库的别名,例如上述的 origin
:
1 | git remote set-url --add origin https://new-push-url.git |
设置后再次用 git remote -v
查看远程仓库链接,即可看到已经有两个 Push 地址:
1 | origin https://XXX.git (fetch) |
实际上也可以通过直接修改当前仓库的局部配置文件添加,修改 仓库目录/.git/config
文件,在 [remote]
部分内添加一个 url
配置:
1 | [core] |
2.2 同时连接到多个远程仓库
假如有一个本地仓库,出于容灾、备份、等目的,同时推送到了两个远程托管平台,以 GitHub 和 Coding 为例:
- 假设 GitHub 上的远程仓库地址为
https://XXX.github.git
- 假设 Coding 上的远程仓库地址为
https://XXX.coding.git
。
而其他人分别基于不同的平台各自推送了特性分支,此时两个远程仓库的分支列表分别为:
1 | # GitHub 的分支列表: |
假设基于 GitHub 的远程仓库克隆了本地仓库,此时如果直接在 develop
分支上尝试合并 release
分支,会因为找不到 release
分支而失败:
1 | merge: release - not something we can merge |
想要对这两个来自不同平台的独立的分支做合并,就需要让本地仓库同时连接多个远程仓库了。
通过 git remote -v
查看本地仓库当前的远程连接地址:
1 | origin https://XXX.github.git (fetch) |
给本地仓库再添加 Coding 的远程仓库连接地址,为了方便区分将新的远程仓库命名为 coding
,则对应命令为:
1 | # git remote add <option> [name] [url] |
再次通过 git remote -v
即可看到该本地仓库已经同时连接到了两个远程仓库:
1 | origin http://XXX.github.git (fetch) |
接下来同时把两个远程仓库的数据都拉取下来:
1 | # 拉取名为 origin 的仓库,即 GitHub 上的 |
再次尝试在 develop
分支上合并 release
分支即可正常合并,当然如果有冲突也会进入常规流程:
1 | # 切换到 develop 分支 |
2.3 跨仓库Cherry-Pick
通常来说 Cherry-Pick 发生在仓库内的不同分支,用于将其他分支的改动同步到当前分支。
如果一个仓库 GitHub
想要在 Cherry-Pick 另一个仓库 Coding
的提交(例如 commit123fromsource),就会报错:
1 | fatal: bad revision 'commit123fromsource' |
但如果这两个仓库是 Fork 的关系,或者只是同一个仓库在不同托管平台的备份,本质上它们是同源的,想要互相支持 Cherry-Pick 的话就需要通过上文 2.2 中的方法,给本地仓库同时添加两份远程仓库的连接,然后就能随意 Cherry-Pick 了,当然如果发生冲突也会进入常规流程。
实际上,一个本地仓库可以随意添加多个远程仓库的地址,然后就能随意操作其他仓库的分支或 Commit,但是 Cherry-Pick 需要满足一定的条件,例如涉及到的改动文件具有同源的改动记录,否则就会失败,只能从最开始文件创建的时候开始 Cherry-Pick 才行。