Git 学习


Windows 初始化操作、基础操作

  1. 新建文件夹
  2. 进入文件夹,右击git bash here
1
2
3
4
$ git init
#(添加用户名+email)方法在底下 #
$ git remote add origin XXX # 添加远程仓库地址
$ git pull



基本配置

1
2
3
4
5
$ git config --global user.name 'username'              # 设置用户名
$ git config --global user.email 'your_email@xx.com' # 设置邮箱
$ git config --list # 查看设置
$ git config credential.helper store # 不用每次push都输入账号密码
$ git config http.proxy # 开VPN代理,push失败 但能打开页面



基本操作

1
2
3
4
# 提交操作
$ git add '文件名' # 工作区→暂存区
$ git commit -m '描述' # 暂存区→Git仓库
$ git push origin master # 提交到 master 分支
1
2
3
4
5
# 远程仓库
$ git remote -v # 查看远程仓库详细信息,可以看到仓库名称
$ git remote remove orign # 删除orign仓库(如果把origin拼写成orign,删除错误名称仓库)
$ git remote add origin 'XXX' # 重新添加远程仓库地址
$ git remote set-url --add origin "XXX" # 添加多个仓库地址
1
2
3
4
5
6
# 分支操作
$ git branch # 展示分支
$ git branch -d master # 将master分支删除
$ git merge master # 将master分支合并到main上
$ git checkout -b main # 切换到main分支上(没有则创建)
$ git checkout . # 本地所有修改的。没有的提交的,都返回到原来的状态
1
2
3
4
5
6
7
8
# 推拉操作
$ git clone -b dev origin # 拉取特定分支(dev:分支名称)
$ git fetch origin master # 强制覆盖本地
$ git pull origin dev

$ git push origin main # 推到main分支上
$ git push -u origin master # 提交到远程仓库的master主干,并设置origin为上游分支(即后续 git push 即可)
$ git push -f origin master # 强制上传覆盖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 其他操作

$ git status # 查看当前文件的状况(工作区/暂存区)

# 查
$ git config --global --list
$ git config --global user.name
$ git remote -v

# 增
$ git config --global --add user.name 'xld'
$ git remote set-url --add origin "XXX" # 添加多个仓库地址

# 删
$ git config --global --unset user.name

# 改
$ git config --global user.name 'xld'

菜鸟教程 - Git 基本操作:https://www.runoob.com/git/git-basic-operations.html






撤销

  • 大写的 HEAD 表示最近的一次commit
  • HEAD~1 中的 ~1 表示之前一个,退回两个就 ~2 ,如此类推

撤销 git add 操作

  1. 从暂存区移出

    1
    2
    3
    git reset <changed_file>

    git restore --stage <changed_file>

    该操作较为安全,只会把文件从 暂存区 移出,不会对硬盘上的源文件进行修改

  2. 还原磁盘上的文件

    1
    git checkout HEAD <changed_file>

    这个操作会丢失硬盘上的修改,需要注意!


撤销 git commit 操作

  1. 撤销 local git 里的 commit

    1
    git reset --soft HEAD~1

    硬盘里的文件不会变,文件的变化也会保留在暂存区里,只是这个 commit 被干掉了

  2. 同时撤销 git commitgit add

    1
    2
    3
    git reset HEAD~1
    等价于
    git reset --mixed HEAD~1

    只保留硬盘里的文件,暂存区里的 add,和 local git 里的 commit 被干掉了

  3. 撤销文件的所有修改

    1
    git reset --hard HEAD~1

    硬盘里的文件,暂存区里的 add,和 local git 里的 commit 都被干掉

    文件完整恢复到初始的状态

    虽然这个操作本身可以撤销,但直观上看文件就是被恢复到原来的状态的,需要找回甚是麻烦,使用时要颇为小心!

通过 git revert 进行撤销

git reset 删除前一个 commit 不同的是,git revert 本质是增加一个 commit

这个新的 commit 的内容,是你之前 commit-commit

Init —> +Change —> -Change —> Init

1
git revert HEAD

也就是把前一个 commit

的内容变成 ****,
的内容变成

再 commit 放回到 git 里


resetrevert 的对比

  1. reset 只能回到之前某一个commit的状态,但revert可以撤销中间任意一个commit

Init —> +Change1 —> +Change2 —> -Change1 —> Change2

在使用了 git push 之后,特别是在 公有分支 时,不能通过 reset 来删除分支中的commit,只能添加自己合进去的 commit-commit 来撤销自己的操作

如果是 个人分支 ,可以使用 git reset 来撤销

1
2
git reset --hard HEAD~1
git push -f # 不然远端看提交上来的 缺少commit






工作流

merge

merge有两种合并,一种是快进合并,另一种是三路合并

  • 快速合并

    当前工作分支到合并目标分支之间的提交历史是线性路径时,可以进行快进合并。

  • 三路合并

merge是先寻找两个分支最近的公共祖先 merge base ,然后将该祖先与当前分支以及要合并的分支的差异应用到当前分支上

rebase

相当于把自己当前的commit先延后,先把其他的合在前面,然后再提交自己的commit

与直接merge不同

main 分支

1
2
3
# feature分支:
git rebase main

可能触发rebase conflict

主分支:squash and merge

squash 把这个分支上的所有改变,合并成一个改变,然后把这个改变 merge 进去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stateDiagram
[*] --> Main_Init
Main_Init --> Main_Commit_1
Main_Commit_1 --> Main_Commit_2
Main_Commit_2 --> Main_Commit_3
Main_Commit_1 --> feature: git checkout -b feature
state feature {
[*] --> feature_commit_1
feature_commit_1 --> feature_commit_2
}


Main_Commit_3 --> ·
feature --> · : git rebase main

· --> Main_merge_commit: diff Main_Commit_1 & Main_Commit_3 & feature_commit_2


flowchart TB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
graph TB
Main(main)
Main2(main-commit-1)
Main3(main-commit-2)
Main4(main-commit-3)
Main5(main-commit-merge)

feature(feature)
feature1(feature-commit-1)
feature2(feature-commit-2)

merge{{"diff:
当前分支的头结点:main-commit-3 &&
要合并的分支的头结点:feature-commit-2 &&
最近的公共的祖先结点:main-commit-1"}}

Main-->Main2
Main2-->Main3
Main3-->Main4

Main2-- git checkout -b feature -->feature

feature-->feature1
feature1-->feature2

Main4 --git merge feature --> merge
Main2 -.->merge
feature2 --> merge

merge --> Main5


Github

1
2
3
4
5
6
7
8
9
# github.con

13.114.40.48
13.250.177.223
13.229.188.59
52.74.223.119
52.192.72.89
140.82.112.4
192.30.255.113