文章

Git GUI工具

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(免费)

ir3gz

Git fork 解决冲突

tfk9u

git fork 自带 merge tools 解决冲突

5s4cl

te2jg

  • Select Left 应用左边的更改
  • Select Right 应用右边的修改,如果 Left 已经更改,不会覆盖,会叠加

疑问

配置了 --recurse-submodules git pull 按钮报错

执行命令查看 –recurse-submodules 是否配置了,true 表示配置了:

Git config –show-origin submodule. Recurse.

52s9h
配置成 true 后,fork 每次手动 git pull 都报错
aqqy4
解决:去掉 –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 代表的是合并后的结果

72x2b
冲突后如何选择?

  • 右上角的↑↓箭头可以切换冲突
  • Accept Remote 选择 remote 的修改
  • Accept Local 选择 local 的修改
  • Accept Combination Remote First 先选择 Remote 再选择 Local
  • Accept Combination Local First 先选择 Local 再选择 Remote
  • Copy 拷贝当前行

mac 上的不太一样,merge 完成点击 Complete Merge 即可:
nv2vs

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

x40cd

SourceTree 之 pull

h3r6q

  1. Commit merged changes immediately
    将 merge 过来的代码直接 commit,不会 push
  2. Include messages from commits being merged in merge commit
    将 merge 的代码的 commit 添加到 commit messages 中
  3. Create a new commit even if fast-forward is possible
    会创建一条新的 commit message 如果符合 fast-forward
  4. Rebase instead of merge
    用 rebase 替代 merge,前提是你没有要 commit 的代码;分支线很好看,不会凌乱

SourceTree 之 merge

1. 首先切换到要合并的分支

2. 点击工具栏上的 merge

s5trp

  • Commit merge immediately(if no conflicts)
    勾选会自动提交这次 Merege Commit, 否则的话, 你需要手动提交;但不会 push。
  • Include messages from commits being merged in merge commit
    会把这个分支上(被合并分支)的所有的提交日志附加到 Merege Commit 的提交日志中.

8zrb9

  • Create a new commit even if fast-forward is possible
    会创建一条新的 merger commit message

xqhc2

SourceTree git rebase -i 变基

未 push 到远端

选中 9961a67d5d3e528df32a49f8800cd8b289436bf3(不包括)
k6os6
Rebase children of 9961a67d5 interactively
h5q72

  1. 上下箭头变更 commit 顺序
  2. squash with previous,只能选择第一个(在最后一个点击无效),后面的合并到该 commit,而 commit message 默认为:
1
2
3
提交错了啊 (+1 squashed commit)
Squashed commits:
[d087858] 连击动画

19iwr

  1. Edit message 可以更改 commit message
  2. Delete,删除该 commit
1
2
git rebase --abort // 放弃
git rebase --continue // 继续

已经 push 到远端

  1. 同未 push 到远端
  2. 需要加个 git push -f 强推

SourceTree 回滚

1、Unstaged files 和 Staged files 需要回滚

  • Unstaged files 未 git add 文件状态

  • Staged files git add 后文件状态
    此时的文件还是处于本地分支, 远端还没有, 直接选中要回滚的文件右键 Discard 丢弃掉
    w29zz

2、已经 commit,未 push

这个可以先 git pull --rebase 下来,此时你的 commit 在最上面;然后再选中你提交的上一个 commit,然后 reset,选择 hard 模式。
4dim5

3、已经 push 的

要注意选择 commit id

  1. 选中要回滚的 commit,
  2. 右键,Reverse commit,这种方式不好有冲突,会留下一个 Revert 的 commit 记录

然后生成一条未 push 的 commit,并生成一条 commit msg,类似 Revert "fix: Splash页,debug环境20秒跳转"

  1. 也可以用 git reset,修改后,git push -f 强推(这种方式可能容易出冲突,但是没有了 log 了)

SourceTree 丢弃本地未 commit 的修改记录和新增的文件

1、没有新增的文件

  • 方式 1:Repository→Reset
  • 方式 2:右键 File Statusi7dhb
  • Discard File Changes 丢弃当前选中的文件的修改(这种方式不能删除新增的文件)
  • Reset All 丢弃所有的修改(这种方式不能删除新增的文件)

jcrhk

如果要删除新增的文件,上诉操作后,选中要删除的文件右键 remove

2、有新增的文件

Repository→Checkout Clean
04fac

可以 Discard 修改的文件,貌似也删除不了新增的文件

SourceTree 配置 merge tools:Beyond Compare

配置 Beyond Compare 辅助解决冲突

  • 在 SourceTree 配置 BeyondCompare 工具

hxsaj

  • 启动冲突解决外部工具

a2m1t

  • 这时会启动 BeyondCompare

qjlcp

BC 工具对比解决 git 冲突时 Mine/Theirs 区分

diosm

  1. 如果没有加 --rebease,就是 merge,左边 xxx_LOCAL 就是你提交的,右边的 xxx_REMOTE 就是他人提交的
  2. 如果加了 --rebase,左边的 xxx_LOCAL 就是他人提交的,右边的 xxx_REMOTE 就是你提交的
  3. 蓝色代表的 LOCAL 的,灰色代表中间的 BASE,粉色代表的是 REMOTE 的;默认 BC 会为什么自动合并代码
    1. 当出现冲突时,冲突的地方会有红色的感叹号,我们可以选择用 LOCAL 的还是 REMOTE;或者先 left 再 right;或者先 right 再 left
    2. 点击上方工具栏的 Next ConfilctPrev 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 解决冲突时的坑

n45el

  1. SourceTree 在解冲突时,如果使用 Resolve using 'Theirs',不是指冲突部分使用他人版本,而是将整个文件 Resolve using 'Theirs'没有冲突的那部分也会被丢弃。

https://segmentfault.com/a/1190000019990611

  1. git merge/git pull 时的冲突
    这个时候,Resolve using 'Mime' 表示的是自己本地的修改;Resolve using 'Theirs' 表示的是远端的修改
  2. git rebase 方式的冲突
    Resolve using 'Mime' 表示的是远端的修改;Resolve using 'Theirs' 表示的是本地的修改,这个要注意
  3. applying a stash
    这个没有试

Mine/Theirs 的解释

官方解释
https://community.atlassian.com/t5/Git-questions/Resolve-using-quot-theirs-quot-vs-quot-mine-quot-what-is-the/qaq-p/393422

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 代表远端

官方问题反馈:
https://jira.atlassian.com/browse/SRCTREE-1579?_ga=2.74721882.952710698.1566959108-1816678471.1566959108

注意

免费版本不支持 Three-Way 冲突对比,只有 Local 和 Remote 对比

SourceTree 配置 merge tools:Vscode

  1. Vscode: Install Command tools
  2. 配置 diff tool: code --diff --wait "$LOCAL" "$REMOTE"
  3. 配置 merge tool: code -n --wait "$MERGED"

ovmcr

SourceTree 配置多个 ssh key

Tools→Options:
5a7z6

lazygit 终端 git 图形化

本文由作者按照 CC BY 4.0 进行授权