Git GUI工具
Git Fork
比 SourceTree 简洁,速度快;Fork - a fast and friendly git client for Mac and Windows
基本使用
配置 Merge tool/External Diff Tool
配置路径:File→Preferences
- 可配置 Beyond Compare 4(收费)
- 可配置 VS Code(免费)
Git fork 解决冲突
git fork 自带 merge tools 解决冲突
- Select Left 应用左边的更改
- Select Right 应用右边的修改,如果 Left 已经更改,不会覆盖,会叠加
疑问
配置了 --recurse-submodules
git pull 按钮报错
执行命令查看 –recurse-submodules 是否配置了,true 表示配置了:
Git config –show-origin submodule. Recurse.
配置成 true 后,fork 每次手动 git pull 都报错
解决:去掉 –recurse-submodules=true 配置,fork 的 git pull 命令不会自动加上该配置,fork 在 pull/checkout 会自动更新 submodules
Git config –global submodule. Recurse false
VS Code 解决 Git 冲突
vscode 解决 git pull –rebase 出现的冲突
rebase 变基后,本地的变成了 remote 了,远端的变成了 local,所以:
- Remote 代表的是本地你自己的修改
- Local 代表的是远端
- Result 代表的是合并后的结果
- 右上角的↑↓箭头可以切换冲突
- Accept Remote 选择 remote 的修改
- Accept Local 选择 local 的修改
- Accept Combination Remote First 先选择 Remote 再选择 Local
- Accept Combination Local First 先选择 Local 再选择 Remote
- Copy 拷贝当前行
mac 上的不太一样,merge 完成点击 Complete Merge
即可:
SourceTree
SourceTree 跳过 Atlassian 账号,免登陆,跳过初始设置
SourceTree 安装之后需要使用账号登陆以授权,并且是强制登陆。
登录过程非常漫长,并未在不 FQ 的情况下是不能成功的,下面记录一下跳过登录的方法:
装之后,转到用户本地文件夹下的 SourceTree 目录,找到 accounts.json
文件,没有则新建。C:\Users\Administrator\AppData\Local\Atlassian\SourceTree
输入以下内容保存即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[
{
"$id": "1",
"$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
"Authenticate": true,
"HostInstance": {
"$id": "2",
"$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
"Host": {
"$id": "3",
"$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
"Id": "atlassian account"
},
"BaseUrl": "https://id.atlassian.com/"
},
"Credentials": {
"$id": "4",
"$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
"Username": "",
"Email": null
},
"IsDefault": false
}
]
现在再打开 SourceTree,直接显示主窗口了。
SourceTree&Git 部分名词解释
- 克隆 (clone)
从远程仓库 URL 加载创建一个与远程仓库一样的本地仓库 - 提交 (commit)
将暂存文件上传到本地仓库(我们在 Finder 中对本地仓库做修改后一般都得先提交一次,再推送) - 检出 (checkout)
切换不同分支 - 添加(add)
添加文件到缓存区 - 移除(remove)
移除文件至缓存区 - 暂存 (git stash)
保存工作现场 - 重置 (reset)
回到最近添加 (add)/提交 (commit) 状态 - 合并 (merge)
将多个同名文件合并为一个文件,该文件包含多个同名文件的所有内容,相同内容抵消 - 抓取 (fetch)
从远程仓库获取信息并同步至本地仓库 - 拉取 (pull)
从远程仓库获取信息并同步至本地仓库,并且自动执行合并(merge)操作,即pull = fetch + merge - 推送 (push)
将本地仓库同步至远程仓库,一般推送(push)前先拉取(pull)一次,确保一致 - 分支 (branch)
创建/修改/删除分支 - 标签 (tag)
给项目增添标签 - 工作流 (Git Flow)
团队工作时,每个人创建属于自己的分支(branch),确定无误后提交到 master 分支 - 终端 (terminal)
可以输入 git 命令行
SourceTree 多标签 (TAB) 支持
- Windows 上的 SourceTree 默认就有多标签,而 Mac 版的在设置里找了半天没找到
- Mac Window > Merge All Windows
SourceTree 之 pull
- Commit merged changes immediately
将 merge 过来的代码直接 commit,不会 push - Include messages from commits being merged in merge commit
将 merge 的代码的 commit 添加到 commit messages 中 - Create a new commit even if fast-forward is possible
会创建一条新的 commit message 如果符合 fast-forward - Rebase instead of merge
用 rebase 替代 merge,前提是你没有要 commit 的代码;分支线很好看,不会凌乱
SourceTree 之 merge
1. 首先切换到要合并的分支
2. 点击工具栏上的 merge
- Commit merge immediately(if no conflicts)
勾选会自动提交这次 Merege Commit, 否则的话, 你需要手动提交;但不会 push。 - Include messages from commits being merged in merge commit
会把这个分支上(被合并分支)的所有的提交日志附加到 Merege Commit 的提交日志中.
- Create a new commit even if fast-forward is possible
会创建一条新的 merger commit message
SourceTree git rebase -i 变基
未 push 到远端
选中 9961a67d5d3e528df32a49f8800cd8b289436bf3
(不包括)Rebase children of 9961a67d5 interactively
- 上下箭头变更 commit 顺序
- squash with previous,只能选择第一个(在最后一个点击无效),后面的合并到该 commit,而 commit message 默认为:
1
2
3
提交错了啊 (+1 squashed commit)
Squashed commits:
[d087858] 连击动画
- Edit message 可以更改 commit message
- Delete,删除该 commit
1
2
git rebase --abort // 放弃
git rebase --continue // 继续
已经 push 到远端
- 同未 push 到远端
- 需要加个 git push -f 强推
SourceTree 回滚
1、Unstaged files 和 Staged files 需要回滚
Unstaged files 未 git add 文件状态
Staged files git add 后文件状态
此时的文件还是处于本地分支, 远端还没有, 直接选中要回滚的文件右键 Discard 丢弃掉
2、已经 commit,未 push
这个可以先 git pull --rebase
下来,此时你的 commit 在最上面;然后再选中你提交的上一个 commit,然后 reset,选择 hard 模式。
3、已经 push 的
要注意选择
commit id
- 选中要回滚的 commit,
- 右键,Reverse commit,这种方式不好有冲突,会留下一个 Revert 的 commit 记录
然后生成一条未 push 的 commit,并生成一条 commit msg,类似 Revert "fix: Splash页,debug环境20秒跳转"
- 也可以用 git reset,修改后,git push -f 强推(这种方式可能容易出冲突,但是没有了 log 了)
SourceTree 丢弃本地未 commit 的修改记录和新增的文件
1、没有新增的文件
- 方式 1:Repository→Reset
- 方式 2:右键 File Status
- Discard File Changes 丢弃当前选中的文件的修改(这种方式不能删除新增的文件)
- Reset All 丢弃所有的修改(这种方式不能删除新增的文件)
如果要删除新增的文件,上诉操作后,选中要删除的文件右键 remove
2、有新增的文件
可以 Discard 修改的文件,貌似也删除不了新增的文件
SourceTree 配置 merge tools:Beyond Compare
配置 Beyond Compare 辅助解决冲突
- 在 SourceTree 配置 BeyondCompare 工具
- 启动冲突解决外部工具
- 这时会启动 BeyondCompare
BC 工具对比解决 git 冲突时 Mine/Theirs 区分
- 如果没有加
--rebease
,就是 merge,左边xxx_LOCAL
就是你提交的,右边的xxx_REMOTE
就是他人提交的 - 如果加了
--rebase
,左边的xxx_LOCAL
就是他人提交的,右边的xxx_REMOTE
就是你提交的 - 蓝色代表的 LOCAL 的,灰色代表中间的 BASE,粉色代表的是 REMOTE 的;默认 BC 会为什么自动合并代码
- 当出现冲突时,冲突的地方会有红色的感叹号,我们可以选择用 LOCAL 的还是 REMOTE;或者先 left 再 right;或者先 right 再 left
- 点击上方工具栏的
Next Confilct
或Prev Conflict
可快速定位到后/前一个冲突的代码块
用 BC 解决冲突时不生成.orig
- 用 BC 解决完冲突 Session→Exit , 完毕
但是会生成 README.md.orig 文件
- 不生成
.orig
文件
1
git config --global mergetool.keepBackup false
- 添加到
.gitignore
忽略列表
1
2
# git mergetool backup
*.orig
SourceTree Mine/Theirs 解决冲突时的坑
- SourceTree 在解冲突时,如果使用
Resolve using 'Theirs'
,不是指冲突部分使用他人版本,而是将整个文件Resolve using 'Theirs'
;没有冲突的那部分也会被丢弃。
- git merge/git pull 时的冲突
这个时候,Resolve using 'Mime'
表示的是自己本地的修改;Resolve using 'Theirs'
表示的是远端的修改 - git rebase 方式的冲突
Resolve using 'Mime'
表示的是远端的修改;Resolve using 'Theirs'
表示的是本地的修改,这个要注意 - applying a stash
这个没有试
Mine/Theirs 的解释
1
2
3
When you have conflict between your file and the file that you're merging, you have two choices:
"Mine" - Your file will be used to solve the conflicts
"Theirs" - The Target file will be used to solve the conflicts.
啊男公司 git 布道师解释:
- rebase 别人的分支,相当于把别人分支当成主体,自己就是外来的; 所以这种情况,Mine 代表远端,Theris 代表你的分支
- merge 别人分支过来,相当于当前这个是主体,别人是外来的节点;这种情况,Mine 代表你的分支,Theirs 代表远端
注意
免费版本不支持 Three-Way 冲突对比,只有 Local 和 Remote 对比
SourceTree 配置 merge tools:Vscode
- Vscode: Install Command tools
- 配置 diff tool:
code --diff --wait "$LOCAL" "$REMOTE"
- 配置 merge tool:
code -n --wait "$MERGED"