git学习篇

Yaurora

本文不是记录所有的命令, 会将部分命令做一个简易说明

git操作流程

看懂上面的流程, 就可以大致知道自己要进行什么操作,以及怎样操作

安装

安装的话, 自己搜一下吧, 问题应该不大

新建

1
2
3
4
5
# 在当前目录下新建一个代码库 [新建一个目录, 初始化为代码库]
$ git init [project-name]

# 远程拷贝一个项目 , 克隆到本地
$ git clone <git-repo-url> [project-name]

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看 config
$ git config --list

# 编辑 config
$ git config -e [--global]

# 修改用户信息
$ git config [--global] user.name "Your Name"
$ git config [--global] user.email "email@example.com"

# 命令别名
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
# 个人喜欢将常用的 commit 简写为 ci, checkout简写为 co
# --global 是全局配置, 不加上只能在对应的git 目录下使用

常用命令

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
# 查看工作区和暂存区的状态
$ git status
# 将工作区的文件提交到暂存区
$ git add .
# 提交到本地仓库
$ git commit -m "本次提交说明"
# add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)
$ git commit -am "本次提交说明"
# 将本地分支和远程分支进行关联
$ git push -u origin branchName
# 将本地仓库的文件推送到远程分支
$ git push
# 拉取远程分支的代码
$ git pull origin branchName
# 合并分支
$ git merge branchName
# 查看本地拥有哪些分支
$ git branch
# 查看所有分支(包括远程分支和本地分支)
$ git branch -a
# 切换分支
$ git checkout branchName
# 临时将工作区文件的修改保存至堆栈中, 我个人是不太喜欢用stash的, 习惯是切换到另一个分支,保存结点。 毕竟不小心
# 删除 stash中的内容, 找回也挺麻烦的
$ git stash
# 将之前保存至堆栈中的文件取出来
$ git stash pop

其它命令

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
## rm
# 删除暂存区和工作区的文件
$ git rm [filename]
# 只删除暂存区的文件,不会删除工作区的文件, 停止追踪文件(后面将其添加至gitignore)
$ git rm --cached [filename]


## commit
# 补充提交, 提交至上一个结点中
$ git commit --amend [message]
$ git commit --amend -no-edit
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]


## push & pull & fetch
# 将本地仓库的文件推送到远程分支
# 如果远程仓库没有这个分支,会新建一个同名的远程分支
# 如果省略远程分支名,则表示两者同名
$ git push <远程主机名> <本地分支名>:<远程分支名>

# 拉取并合并项目其他人员的一个分支
$ git pull origin branchname
# 等同于 fetch + merge
$ git fetch origin branchName
$ git merge origin/branchName

# 强推, 覆盖远程结点
$ git push -f


## branch
# 查看本地分支[-r 远程, -a 本地和远程]
$ git branch [-r, -a]
# 新建分支, 可以指向某个提交结点
$ git branch <branchName> [commit]
# 切换分支
$ git checkout <branchName>
# 新建并切换
$ git checkout -b <branchName>

# 删除分支
# 删除本地 [-d 被删除的分支上有没有合并的结点会阻止, -D 强制删除分支 ]
$ git branch [-d, -D] <branchName>
# 删除远程分支
$ git push <远程主机名> :<远程分支名>
$ git push <远程主机名> --delete <远程分支名>
$ git branch -dr <remote/branch>


## diff
# 查看工作区和暂存区所有文件的对比[单个文件的对比]
$ git diff [fileName]
# 1.你修改了某个文件,但是没有提交到暂存区,这时候会有对比的内容
# 一旦提交到暂存区,就不会有对比的内容(因为暂存区已经更新)
# 2.如果你新建了一个文件,但是没有提交到暂存区,这时候 diff 是没有结果的

# 查看暂存区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的对比
$ git diff --cached/--staged
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 查看本地两个分支的所有的对比[单个文件的对比]
$ git diff <branchName1> <branchName2> [fileName]
# 查看远程分支和远程分支[本地分支]的对比 或 单个文件
$ git diff <远程主机名/branchname1> <远程主机名/branchname2 | branchname2> [filenName]

# 查看两个 commit 的对比
$ git diff commit1 commit2

# 一个有意思的命令, 查看自己写了多少代码
$ git diff --shortstat "@{0 day ago}"

## blame 谁动了你的面包, 甩锅大法
# 显示指定文件是什么人在什么时间修改过
$ git blame [fileName]

## log
# 查看提交历史
$ git log --oneline
--grep="关键字"
--graph
--all
--author "username"
--reverse
-num
-p
--before= 1 day/1 week/1 "2019-06-06"
--after= "2019-06-06"
--stat
--abbrev-commit
--pretty=format:"xxx"

# oneline -> 将日志记录一行一行的显示
# grep="关键字" -> 查找日志记录中(commit提交时的注释)与关键字有关的记录
# graph -> 记录图形化显示 !!!
# all -> 将所有记录都详细的显示出来
# author "username" -> 查找这个作者提交的记录
# reverse -> commit 提交记录顺序翻转
# before -> 查找规定的时间(如:1天/1周)之前的记录
# num -> git log -10 显示最近10次提交 !!!
# stat -> 显示每次更新的文件修改统计信息,会列出具体文件列表 !!!
# abbrev-commit -> 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符 !!!
# pretty=format:"xxx" -> 可以定制要显示的记录格式 !!!
# p -> 显示每次提交所引入的差异(按 补丁 的格式输出)!!!

# 常用
$ git log --graph [--stat]
# 查看本地 git 命令历史, 常用来恢复某些失误的操作
$ git reflog

## show
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]


## tag
# 列出所有tag
$ git tag
# 新建一个tag在指定commit, 可以指定说明文字
$ git tag [tag] [commit] [-m "message"]
# 查看单个标签具体信息
$ git show <tagname>

# 推送一个本地标签
$ git push <远程主机名> <tagname>
# 推送全部未推送过的本地标签
$ git push <远程主机名> --tags

# 删除本地tag
$ git tag -d [tag]
# 删除远程tag, 有点像删除远程分支
$ git push <远程主机名> :refs/tags/<tagname>


## remote
# 查看所有远程主机
$ git remote
# 查看关联的远程仓库的详细信息
$ git remote -v
# 删除远程仓库的 “关联”
$ git remote rm <远程主机名>
# 添加远程仓库的 “关联”
$ git remote add <远程主机名> <remote-url>
# 设置远程仓库的 “关联”
$ git remote set-url <远程主机名> <newurl>

单读讲讲

  • 分支合并

    • merge

      merge方式

      1
      2
      3
      4
      5
      # 将另外一个分支合并到当前分支,主要是合并到master
      $ git merge <branchName> [--fast-forward | --no-ff | --squash]
      # --fast-forward: 会在当前分支的提交历史中添加进被合并分支的提交历史
      # --no-ff: 会生成一个新的提交,让当前分支的提交历史不会那么乱
      # --squash: 不会生成新的提交,会将被合并分支多次提交的内容直接存到工作区和暂存区,由开发者手动去提交,这样当前分支最终只会多出一条提交记录,不会掺杂被合并分支的提交历史
    • rebase

      关于rebase 的示意图, 看看这篇文章吧

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      # 将master分支中的修改添加到master分支上(保证当前分支的修改, 是基于master分支上的修改)
      $ git checkout <branchName>
      $ git rebase master
      # 或者直接使用
      $ git rebase <branchName1> <branchName2>

      # 对当前分支提交的 startpoint -> endpoint (前开后闭) 提交记录进行整理
      $ git rebase -i [startpoint] [endpoint]
      # pick:保留该commit(缩写:p)
      # reword:保留该commit,但我需要修改该commit的注释(缩写:r)
      # edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
      # squash:将该commit和前一个commit合并(缩写:s)
      # fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
      # exec:执行shell命令(缩写:x)
      # drop:我要丢弃该commit(缩写:d)

      # 选择特定的结点到指定分支(区间前开后闭), 建议使用 cherry-pick
      $ git rebase [startpoint] [endpoint] --onto master
      # 注意: 添加过去的结点, 还处于游离状态(HEAD没有处于最新结点) , 可以新建一个分支或直接使用 reset --hard
    • cherry-pick

      1
      2
      3
      4
      5
      6
      7
      8
      # 将提交的结点 添加到当前分支,会产生一个新的提交(哈希值不一样)
      $ git cherry-pick <commitHash>
      # 将另外一个分支上最新提交的结点添加到当前分支
      $ git cherry-pick <branchName>
      # 转移多个提交
      $ git cherry-pick <HashA> <HashB>
      # 转移一系列提交(区间, 左开右闭)
      $ git cherry-pick <HashA>^..<HashB>

      关于cherry-pick, 参考这里

  • 撤销&回退

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    # 原来的命令
    # 撤销工作区修改的文件, 还未提交到暂存区
    $ git checkout filname
    # 撤销暂存区的文件
    $ git reset HEAD filename

    ## checkout
    # 恢复暂存区的指定文件到工作区
    $ git checkout <filename>
    # 恢复暂存区的所有文件到工作区
    $ git checkout .
    # 恢复某个commit的指定文件到暂存区和工作区
    $ git checkout [commit] [file]
    # 检出结点, 标签
    $ git checkout[<commitid> | <tag>]

    ## reset
    # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
    $ git reset [file]
    # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变, 软回退
    $ git reset [commit]
    # 重置暂存区与工作区,与上一次commit保持一致, 硬回退
    $ git reset --hard [commit]

    ## revert
    # 生成一个撤销指定提交版本的新提交
    $ git revert <commit_id>


    # 新命令
    ## restore & switch
    # 主要还是为了分离 checkout的功能

    # 切换分支 = git checkout <branchName>
    $ git switch <branchName>
    # 创建并切换到新建分支 = git checkout -b <newbranch>
    $ git switch -c <newBranch>

    # 撤销工作区修改的文件 = git checkout <fileName>
    $ git restore <fileName>
    # 撤销暂存区的文件 = git reset <fileName>
    $ git restore --staged <fileName>
  • 标题: git学习篇
  • 作者: Yaurora
  • 创建于 : 2020-08-09 13:54:54
  • 更新于 : 2023-02-21 21:12:07
  • 链接: https://jingyu.life/2020/08/09/git/git-usage/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。