跳转至

Git

1 git 架构

1 git 3大区

  • 工作区:实际工作目录
  • 暂存区:已add未commit
  • 版本库:commit后

2 HEAD

2.1 HEAD数据文件

  • .git/HEAD保存当前HEAD指向的分支
## HEAD指向main分支
$ cat .git/HEAD
ref: refs/heads/main
  • .git/refs/heads/*保存所有分支的当前HEAD位置
## 当前只有b1、main分支
$ ls .git/refs/heads/
b1  main
## main分支的当前最新提交
$ cat .git/refs/heads/main
62c0dd2831f0770a12b903d9dfca18ab1fa6f62e

2.2 HEAD^和HEAD~

  • HEAD~[number]:表示提交路径上的第n提交的第一个提交,比如:HEAD~2表示父提交的父提交
  • HEAD^[number]:表示父提交的第n个提交,比如:HEAD^2表示第2个父提交(当合并分支后,就会有多个父提交)
  • HEAD~[number]^[number]:表示提交路径上的第n个提交的第n个父提交
  • 示例
$ git log --oneline --graph
* 62c0dd2 (HEAD -> main) add 4.txt
* b55291b add 3.txt
*   9d213ac (tag: tag2) resolve merge 2.txt conflict
|\
| * 53cb60f (b1) branch b1 commit +2
* | 71d793e Merge branch 'b1'
|\|
| * 298fb37 branch b1 commit
* | 934c075 branch main commit
|/
* 1ad14b3 add 2 folder
* 2d5f9d0 merge commit 2,3,4
* efcfdb2 .gitignore
  • 解析:
  • HEAD^==HEAD~:指提交62c0dd2
  • HEAD~2==HEAD~~==HEAD~2^:指提交b55291b
  • HEAD~2^:指提交71d793e
  • HEAD~2^2:指提交53cb60f

2 git配置

<<<<<<< HEAD

1 设置用户名和邮箱

=======

2.1 设置用户名和邮箱

da878a6139b43db91fa05f06a21d78c2811c6e79 如果用户名有空格,则用户名要在引号内,如"zhang san"

$ git config --global user.name [yourname]
$ git config --global user.email [youremail]

<<<<<<< HEAD

2 查看用户配置信息

$ git config --list

3 --local、--global、--system

=======

2.2 查看用户配置信息

$ git config --list

2.3 --local、--global、--system

da878a6139b43db91fa05f06a21d78c2811c6e79 配置文件读取顺序为:--system->--global->--local - --local:操作本地配置文件(.git/config) - --global:操作全局配置文件(~/.gitconfig) - --system:操作系统配置文件($(prefix)/etc/gitconfig) 配置文件读取顺序为:--system->--global->--local <<<<<<< HEAD

4 --add、--get、--get-all

=======

2.4 --add、--get、--get-all

da878a6139b43db91fa05f06a21d78c2811c6e79 - --add:添加一条配置信息(类似附加写) - --get:获取配置信息(如果有多条,只打印最后一条配置项) - --get-all:获取配置信息(打印所有配置项)

## 修改配置项
$ git config --file gitcfg  core.editor "vi"
## 再添加一条配置信息
$ git config --file gitcfg --add core.editor "code --wait"
## 只会打印最后一条配置信息
$ git config --file gitcfg --get core.editor
code --wait
## 打印所有配置项
$ git config --file gitcfg --get-all core.editor
vi
code --wait
<<<<<<< HEAD

5 --unset、--unset-all

=======

2.5 --unset、--unset-all

da878a6139b43db91fa05f06a21d78c2811c6e79 - --unset:删除指定的配置项(当有配置项有多条消息时,会失败) - --unset-all:删除所有指定的配置项

$ git config --file gitcfg --list
core.editor=vi
core.editor=code --wait
## 当有配置项有多条消息时,会失败
$ git config --file gitcfg --unset core.editor
warning: core.editor has multiple values
## 删除所有修改的配置项
$ git config --file gitcfg --unset-all core.editor
<<<<<<< HEAD

6 --list

=======

2.6 --list

da878a6139b43db91fa05f06a21d78c2811c6e79 列出所有配置项

$ git config --system --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=E:/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
<<<<<<< HEAD

7 配置不改变换行符

=======

2.7 配置不改变换行符

da878a6139b43db91fa05f06a21d78c2811c6e79

git config --global core.autocrlf false
git config --global core.filemode false
git config --global core.safecrlf true

<<<<<<< HEAD

1 初始化仓库

=======

3 git基本命令

3.1 初始化仓库

da878a6139b43db91fa05f06a21d78c2811c6e79

## 默认生成分支master
git init

<<<<<<< HEAD

2 添加文件至暂存区

=======

3.2 添加文件至暂存区

da878a6139b43db91fa05f06a21d78c2811c6e79

#添加.git所在目录所有文件
git add .
#添加指定文件
git add file.txt
#使用正则语法
git add *.txt

<<<<<<< HEAD

3 提交至本地仓库

=======

3.3 提交至本地仓库

da878a6139b43db91fa05f06a21d78c2811c6e79

#将暂存区文件提交至本地仓库
git commit -m "提交信息"
#跳过add步骤,直接将已跟踪文件提交至本地仓库
git commit -a -m "提交信息"
## 将暂存区内容提交,但会沿用上一次提交,不会产生新的提交id
git commit --amend

<<<<<<< HEAD

4 查看仓库状态

git status

5 分支、标签、合并

1 tag

带注释的标签有一条可以用git show显示的消息,而没有注释的标签只是一个指向提交的命名指针。推荐使用带注释的标签。

1.1 创建标签

=======

3.4 查看仓库状态

git status

4 分支、标签、合并

4.1 tag

带注释的标签有一条可以用git show显示的消息,而没有注释的标签只是一个指向提交的命名指针。推荐使用带注释的标签。

4.1.1 创建标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 创建不带注释标签
git tag tag1
## 创建带注释的标签
git tag -a v1 -m "v1 标签"
<<<<<<< HEAD

1.2 查看标签

=======

4.1.2 查看标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 显示所有分支
git tag
## 显示指定分支信息
git show tag2
<<<<<<< HEAD

1.3 删除标签

=======

4.1.3 删除标签

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git tag -d tag1
Deleted tag 'tag1' (was 9d213ac)
<<<<<<< HEAD

1.4 推送远程仓库标签

=======

4.1.4 推送远程仓库标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 将标签t1推送到远程仓库origin,命名标签t1
git push origin t1
## 将标签t1推送到远程仓库origin,并命名标签rt2
git push origin t2:rt2
## 推送所有标签
git push origin --tags
<<<<<<< HEAD

1.5 删除远程仓库标签

=======

4.1.5 删除远程仓库标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 删除远程仓库rt2标签
git push origin --delete rt2
## 推送空标签达到删除远程标签作用
git push origin :refs/tags/rt2
<<<<<<< HEAD

1.6 显示远程分支

=======

4.1.6 显示远程分支

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git ls-remote --tags
From https://gitee.com/shuhaiwen/git-test.git
5899883c341d12211c137b7df16e6c502878f7ec        refs/tags/t1
bbd09bdd06950a267a0af5e40cb5e547e14e98ca        refs/tags/v1
5899883c341d12211c137b7df16e6c502878f7ec        refs/tags/v1^{}

其中refs/tags/v1^{}表示的是带注释的标签 <<<<<<< HEAD

1.7 从标签检出内容

=======

4.1.7 从标签检出内容

da878a6139b43db91fa05f06a21d78c2811c6e79 使用新分支去承载检出的标签内容

## 从标签t1上检测到新分支b3,并切换到分支b3
git checkout -b b3 t1
<<<<<<< HEAD

2 branch

2.1 显示分支

=======

4.2 branch

4.2.1 显示分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 显示当前分支
git branch
## 显示所有分支(包括远程分支和本地分支)(远程分支在本地仓库,使用前git fetch可以抓取更新远程分支到本地)
git branch -a
## 显示所有远程跟踪分支
git branch -r
## 显示已合并分支
git branch --merged
## 显示未合并分支
git branch --no-merged
<<<<<<< HEAD

2.2 创建分支

=======

4.2.2 创建分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 创建分支(还在master主分支上)
git branch b1
## 切换分支(在b1分支上)
git checkout b1
## 从指定的提交点创建分支(分支内容在指定的提交点上)
git branch b2 HEAD^
git branch b2 8a58f93
## 从指定的分支创建(从分支b1创建分支b2)
git branch b2 b1
## 从指定的tag创建(从标签t1创建分支b2)
git branch b2 t1

<<<<<<< HEAD

2.3 删除本地分支

=======

4.2.3 删除本地分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 分支未被合并会报错
git branch -d branch1
## 强制删除分支(包括未合并分支)
git branch -D branch1
<<<<<<< HEAD

2.4 分支改名

=======

4.2.4 分支改名

da878a6139b43db91fa05f06a21d78c2811c6e79

git branch -m oldName newName

<<<<<<< HEAD

2.5 推送远程仓库分支

=======

4.2.5 推送远程仓库分支

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:git push 远程仓库名 本地分支:远程分支(远程仓库名可以省略,本地分支和远程分支一样可以只写一个)

## 默认推送当前分支到远程分支(必须远程分支已经和本地分支关联)
git push
## push指定分支
git push b1
## psuh指定分支到远程指定分支
git push b1:rb1
<<<<<<< HEAD

2.6 显示远程分支和本地分支关系

=======

4.2.6 显示远程分支和本地分支关系

da878a6139b43db91fa05f06a21d78c2811c6e79

 git remote show origin
* remote origin
  Fetch URL: https://gitee.com/shuhaiwen/git-test.git
  Push  URL: https://gitee.com/shuhaiwen/git-test.git
  HEAD branch: master
  Remote branches:
    b1     tracked
    b2     tracked
    master tracked
  Local branch configured for 'git pull':
    b2 merges with remote b2
  Local refs configured for 'git push':
    b1     pushes to b1     (up to date)
    b2     pushes to b2     (up to date)
    master pushes to master (fast-forwardable)
<<<<<<< HEAD

2.7 删除远程分支

=======

4.2.7 删除远程分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 方式1:删除远程分支 branch1,其中冒号:前需要空一格,且删除的分支不能是远程仓库的默认分支
git push origin :branch1
## 方式2:
git push [remote] --delete [remote_branch]
<<<<<<< HEAD

2.8 设置跟踪分支

=======

4.2.8 设置跟踪分支

da878a6139b43db91fa05f06a21d78c2811c6e79 为远程仓库某一个分支建立本地分支,即为跟踪分支

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/appveyor
  remotes/origin/configuration
  remotes/origin/context
  remotes/origin/develop
  remotes/origin/disable-nonstandard
  remotes/origin/fix-add-item
  remotes/origin/less-magic
  remotes/origin/libfuzzer
  remotes/origin/long-long-fix
  remotes/origin/master
  remotes/origin/meson
## 方法1 为远程分支context关联本地分支context
$ git checkout -b context origin/context
Switched to a new branch 'context'
Branch 'context' set up to track remote branch 'context' from 'origin'.
$ git branch
* context
  master
## 方法2 使用--track参数
$ git checkout --track origin/appveyor
Switched to a new branch 'appveyor'
Branch 'appveyor' set up to track remote branch 'appveyor' from 'origin'.
$ git branch
* appveyor
  context
  master
## 方式3 直接检出远程仓库分支名(需本地没有此分支,否则将切换到本地分支)
$ git checkout develop
Switched to a new branch 'develop'
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
$ git branch
  appveyor
  context
* develop
  master
<<<<<<< HEAD

2.9 查看所有跟踪分支

=======

4.2.9 查看所有跟踪分支

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git branch -vv
  appveyor f0e93c9 [origin/appveyor] add appveyor
  context  3b0d37f [origin/context] Change name from Configuration to Context
* develop  5437b79 [origin/develop] Add getNumberValue function
  main     324a6ac [origin/master] Update .gitattributes (#544)
<<<<<<< HEAD

2.10 拉取远程分支所有分支

=======

4.2.10 拉取远程分支所有分支

da878a6139b43db91fa05f06a21d78c2811c6e79

title: 步骤如下
1. --track跟踪所有远程分支
2. fetch --all更新所有分支

$ git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
$ git fetch --all
<<<<<<< HEAD

3 switch

=======

4.3 switch

da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:切换分支

git switch branch1
<<<<<<< HEAD

4 checkout

4.1 切换分支

=======

4.4 checkout

4.4.1 切换分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 切换分支(在branch1分支上)
git checkout branch1
<<<<<<< HEAD

4.2 创建新分支的同时切换过去

=======

4.4.2 创建新分支的同时切换过去

da878a6139b43db91fa05f06a21d78c2811c6e79

## 创建新分支的同时切换过去
git checkout -b branch2
<<<<<<< HEAD

5 merge

5.1 合并分支

=======

4.5 merge

4.5.1 合并分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 合并branch1分支到master上
## 先切换到主分支
git checkout master
## 再合并分支到当前主分支
git merge branch1
## 根据提示解决冲突,然后再次commit即可
git commit -am "b1 merge ro master"

<<<<<<< HEAD

5.2 --abort冲突后取消合并

=======

4.5.2 --abort冲突后取消合并

da878a6139b43db91fa05f06a21d78c2811c6e79

## 1. 合并b1到master分支 
$ git merge b1
warning: Cannot merge binary files: 2.txt (HEAD vs. b1)
warning: Cannot merge binary files: 1.txt (HEAD vs. b1)
Auto-merging 2.txt
CONFLICT (content): Merge conflict in 2.txt
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.
## 2. 查看合并冲突状态信息
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   1.txt
        both modified:   2.txt

no changes added to commit (use "git add" and/or "git commit -a")
## 3.取消此次合并
$ git merge --abort
<<<<<<< HEAD

5.3 --no-ff禁止fast forward合并

=======

4.5.3 --no-ff禁止fast forward合并

da878a6139b43db91fa05f06a21d78c2811c6e79

title: 什么是fast forward模式合并?
1. 合并分支b2到主分支master时,如果mater分支的状态没有被更改过,那么这个合并是非常简单的。 b1分支的历史记录包含master分支所有的历史记录,所以通过把master分支的位置移动到b1的最新分支上,Git 就会合并。这样的合并被称为fast-forward(快进)合并。
2. no-fast-forword 则即使在能够fast-forward合并的情况下也会生成新的提交并合并,便于查询合并记录。

  • 示例:默认--ff模式合并,
## 默认--ff是开启的,可以不写,从下图中可以看出没有生成新的合并提交点,b2的提交和mater提交记录一样
$ git merge --ff -m "b2 merge to master" b2

- 示例:--no-ff模式合并

$ git merge --no-ff -m "b2 merge to master" b2

<<<<<<< HEAD

5.4 --squash合并时只产生一条合并记录

=======

4.5.4 --squash合并时只产生一条合并记录

da878a6139b43db91fa05f06a21d78c2811c6e79

1. --squash合并时只产生一条合并记录,当合并分支有太多提交时,且不想要这样提交体现在主分支上,这样就可以使用此命令合并成一条提交记录。
2. 默认是--no-squash

git merge --squash b1

<<<<<<< HEAD

5.5 解决合并冲突

=======

4.5.5 解决合并冲突

da878a6139b43db91fa05f06a21d78c2811c6e79 1. 假设合并时,1.txt文件冲突,合并操作失败 2. 1.txt文件里面会记录冲突信息,大致如下,<<<<<<<=======间数据是HEAD分支数据,=======>>>>>>>是b1分支数据,保留其中一个分支的数据,就能解决冲突

<<<<<<< HEAD
branch main update
=======
branch b1 update
>>>>>>> b1
1.txt
  1. 假设保留HEAD分支数据,1.txt文件变动如下
branch main uodate
1.txt
  1. 重新add 1.txt文件,并commit(合并产生冲突时,冲突文件会从暂存区移除,所以需要重新添加到暂存区)

git add 1.txt
git commit -m "resolve merge 1.txt conflict"
<<<<<<< HEAD

6 mergetool

=======

4.6 mergetool

da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:运行合并冲突解决工具来解决合并冲突

git mergetool
<<<<<<< HEAD

7 rm

  • 功能:从工作树和索引中删除文件

7.1 从工作区和暂存区移除文件

git rm 1.txt

7.2 --cache仅从暂存区移除文件

=======

4.7 rm

  • 功能:从工作树和索引中删除文件

4.7.1 从工作区和暂存区移除文件

git rm 1.txt

4.7.2 --cache仅从暂存区移除文件

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git rm --cache 1.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    1.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        1.txt
<<<<<<< HEAD

8 mv

=======

4.8 mv

da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:移动或重命名文件、目录或符号链接

$ git mv 1.txt 3.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    1.txt -> 3.txt

<<<<<<< HEAD

6 远程仓库

1 clone

  • 功能:克隆远程仓库

1.1 克隆远程仓库

=======

5 远程仓库

5.1 clone

  • 功能:克隆远程仓库

5.1.1 克隆远程仓库

da878a6139b43db91fa05f06a21d78c2811c6e79

## 默认远程仓库名为origin,分支为你克隆的分支名,且在本地创建master分支
git clone [url]
<<<<<<< HEAD

1.2 指定分支克隆

=======

5.1.2 指定分支克隆

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法 - git clone -b 分支名 url - 示例

git clone -b main https://github.com/shuhaiwen/shuhaiwen.github.io.git
<<<<<<< HEAD

1.3 命名远程仓库名

=======

5.1.3 命名远程仓库名

da878a6139b43db91fa05f06a21d78c2811c6e79

## -o 远程仓库名 修改默认仓库名origin
$ git clone -o remote https://gitee.com/shuhaiwen/git-test.git
$ git remote
remote
<<<<<<< HEAD

1.4 指定本地库目录名

=======

5.1.4 指定本地库目录名

da878a6139b43db91fa05f06a21d78c2811c6e79

## 克隆仓库到test目录下,默认目录和是远程仓库名git-test同名
git clone https://gitee.com/shuhaiwen/git-test.git test  
<<<<<<< HEAD

1.5 不拉取标签

=======

5.1.5 不拉取标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## --no-tags 表示不拉取标签(默认是拉取标签),同时设置config文件remote.<remote>.tagOpt=--no-tags ,隐式pull和fetch也不会拉取标签
git clone https://gitee.com/shuhaiwen/git-test.git --no-tags
<<<<<<< HEAD

2 fetch

=======

5.2 fetch

da878a6139b43db91fa05f06a21d78c2811c6e79

fetch和pull功能一样,pull相对于先fetch再merge

  • 功能:从远程仓库更新本地库 <<<<<<< HEAD

2.1 更新本地仓库

=======

5.2.1 更新本地仓库

da878a6139b43db91fa05f06a21d78c2811c6e79

## 1.更新远程分支到本地(不删除本地保存的已失效的远程分支)
git fetch [remote-name]
## 2.更新远程分支到本地(同时删除本地保存的已失效的远程分支)
git fetch --prune
## 3.更新所有分支
git fetch --all
<<<<<<< HEAD

2.2 更新本地仓库但不更新标签

=======

5.2.2 更新本地仓库但不更新标签

da878a6139b43db91fa05f06a21d78c2811c6e79 - 默认拉取分支时会把标签也拉取下来

## -n或--no-tags选项不拉取标签(远程仓库有新标签,也不会拉取下来,默认会拉取)
$ git fetch --no-tags
<<<<<<< HEAD

3 pull

  • 功能:从远程仓库更新本地库,并进行必要的合并

3.1 更新本地仓库

=======

5.3 pull

  • 功能:从远程仓库更新本地库,并进行必要的合并

5.3.1 更新本地仓库

da878a6139b43db91fa05f06a21d78c2811c6e79

## 1.更新远程分支到本地(不删除本地保存的已失效的远程分支)
git pull [remote-name]
## 2.更新远程分支到本地(同时删除本地保存的已失效的远程分支)
git pull --prune
## 3.更新所有分支
git pull --all
<<<<<<< HEAD

3.2 更新本地仓库但不更新标签

=======

5.3.2 更新本地仓库但不更新标签

da878a6139b43db91fa05f06a21d78c2811c6e79 - 默认拉取分支时会把标签也拉取下来

## -n或--no-tags选项不拉取标签(远程仓库有新标签,也不会拉取下来,默认会拉取)
$ git pull --no-tags
<<<<<<< HEAD

4 ls-remote

=======

5.4 ls-remote

da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:列出远程仓库中的引用

## 1.显示所有远程仓库中的分支和标签
$ git ls-remote
From https://gitee.com/shuhaiwen/git-test.git
8a58f93ba3348698f15135c8baa73cbd85709e6a        HEAD
d909ce91167032992a2c7dc1d60dd34db3ad8248        refs/heads/b1
3340aaca055e688e5c827b3342f230c75a7622dd        refs/heads/b2
8a58f93ba3348698f15135c8baa73cbd85709e6a        refs/heads/master
5899883c341d12211c137b7df16e6c502878f7ec        refs/tags/t1
bbd09bdd06950a267a0af5e40cb5e547e14e98ca        refs/tags/v1
5899883c341d12211c137b7df16e6c502878f7ec        refs/tags/v1^{}
<<<<<<< HEAD

4.1 显示远程分支

=======

5.4.1 显示远程分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 2.仅显示分支
$ git ls-remote --head
From https://gitee.com/shuhaiwen/git-test.git
d909ce91167032992a2c7dc1d60dd34db3ad8248        refs/heads/b1
3340aaca055e688e5c827b3342f230c75a7622dd        refs/heads/b2
8a58f93ba3348698f15135c8baa73cbd85709e6a        refs/heads/master
<<<<<<< HEAD

4.2 显示远程标签

=======

5.4.2 显示远程标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 3.仅显示标签
$ git ls-remote --tags
From https://gitee.com/shuhaiwen/git-test.git
5899883c341d12211c137b7df16e6c502878f7ec        refs/tags/t1
bbd09bdd06950a267a0af5e40cb5e547e14e98ca        refs/tags/v1
5899883c341d12211c137b7df16e6c502878f7ec        refs/tags/v1^{}
<<<<<<< HEAD

5 remote

  • 功能:管理远程仓库

5.1 查看远程仓库

=======

5.5 remote

  • 功能:管理远程仓库

5.5.1 查看远程仓库

da878a6139b43db91fa05f06a21d78c2811c6e79

## 指定远程仓库
git remote show [remote-name]
## 所有远程仓库信息
git remote -v
<<<<<<< HEAD

5.2 移除/添加/重命名远程仓库关联

=======

5.5.2 移除/添加/重命名远程仓库关联

da878a6139b43db91fa05f06a21d78c2811c6e79

git remote rm [remote-name]
git remote add [remote-name] https://github.com/<REPO>
git remote rename [old-name] [new-name]
<<<<<<< HEAD

6 push

  • 功能:推送本地版本库到远程仓库

6.1 推送内容到远程仓库

git push [remote-name] [local-branch]:[remote-branch]

6.2 推送远程仓库分支

=======

5.6 push

  • 功能:推送本地版本库到远程仓库

5.6.1 推送内容到远程仓库

git push [remote-name] [local-branch]:[remote-branch]

5.6.2 推送远程仓库分支

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:git push 远程仓库名 本地分支:远程分支(远程仓库名可以省略,本地分支和远程分支一样可以只写一个)

## 默认推送当前分支到远程分支(必须远程分支已经和本地分支关联)
git push
## push指定分支
git push b1
## psuh指定分支到远程指定分支
git push b1:rb1
## 推送所有分支(本地分支全部推送,远程分支没有则创建同名分支)
git push origin --all
<<<<<<< HEAD

6.3 删除远程分支

=======

5.6.3 删除远程分支

da878a6139b43db91fa05f06a21d78c2811c6e79

## 方式1:删除远程分支 branch1,其中冒号:前需要空一格,且删除的分支不能是远程仓库的默认分支
git push origin :branch1
## 方式2:
git push [remote] --delete [remote_branch]
<<<<<<< HEAD

6.4 推送远程仓库标签

=======

5.6.4 推送远程仓库标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 将标签t1推送到远程仓库origin,命名标签t1
git push origin t1
## 将标签t1推送到远程仓库origin,并命名标签rt2
git push origin t2:rt2
## 推送所有标签
git push origin --tags
<<<<<<< HEAD

6.5 删除远程仓库标签

=======

5.6.5 删除远程仓库标签

da878a6139b43db91fa05f06a21d78c2811c6e79

## 删除远程仓库rt2标签
git push origin --delete rt2
## 推送空标签达到删除远程标签作用
git push origin :refs/tags/rt2
<<<<<<< HEAD

6.6 撤销远程分支某个提交

=======

5.6.6 撤销远程分支某个提交

da878a6139b43db91fa05f06a21d78c2811c6e79 1. 先使用reset操作修改本地分支提交 2. 再使用push -f强制推送

git reset --hard commitId
git push -f origin master

6 撤销操作

title: revert和reset不同?
1. revert 只是还原commitId这次提交的修改,且生成一个新提交记录。
2. reset 会将HEAD移动到这次commitId位置,并且在此之后的所有提交都将删除。
3. revert适用于某次提交有误,需要删除此次提交的场景。
<<<<<<< HEAD

1 revert

=======

6.1 revert

da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:还原一些现有的提交

## 会还原commitId这次提交的修改,且生成一个新提交记录
git revert commitId
## 通常会把此次revert提交到远程
git push

<<<<<<< HEAD

2 rebase

  • 功能:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面

2.1 --contine解决合并冲突后重新启动变基过程

=======

6.2 rebase

  • 功能:当执行rebase操作时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,最后将刚才提取的修改应用到基分支的最新提交的后面

6.2.1 --contine解决合并冲突后重新启动变基过程

da878a6139b43db91fa05f06a21d78c2811c6e79

## 1.1 先切换到变基分支,再执行变基到主分支,需要解决冲突(这个和合并操作正好相反,合并是先切换到主分支,再merge合并分支)
git switch b1
git rebase master
## 1.2 或者直接指定主分支和待变基分支
git rebase master b1
## 2. 如果有冲突,解决冲突(可使用git mergetool处理),再执行git rebase --continue,没有冲突不需执行
git rebase --continue
## 3. b1分支rebase后,通常会再次合并到主分支上
git switch master
git merge b1

<<<<<<< HEAD

2.2 --abort取消此处rebase操作

=======

6.2.2 --abort取消此处rebase操作

da878a6139b43db91fa05f06a21d78c2811c6e79 当有合并冲突时,不像继续rebase,使用此命令取消

git rebase --abort
<<<<<<< HEAD

3 restore

  • 功能:恢复工作空间文件
  • restore默认有--worktree选项

3.1 --worktree撤销工作区的修改

=======

6.3 restore

  • 功能:恢复工作空间文件
  • restore默认有--worktree选项

6.3.1 --worktree撤销工作区的修改

da878a6139b43db91fa05f06a21d78c2811c6e79 - 当改变了工作区文件时,此时又不想要更改的内容,通过--worktree选项可以将工作区文件恢复到最近的暂存区或版本库文件 - 此操作会把当前工作区的修改删掉,使用前请确保当前内容不需要

## git restore --worktree <path>
## 撤销指定文件
$ git restore --worktree 1.txt
## 撤销所有文件
$ git restore --worktree .
<<<<<<< HEAD

3.2 --staged取消暂存区文件

=======

6.3.2 --staged取消暂存区文件

da878a6139b43db91fa05f06a21d78c2811c6e79 - 当通过add将文件放入暂存区时,通过--staged选项可以将文件恢复到工作区去

## add 文件到暂存区
git add 1.txt
## 将文件移除暂存区
git restore --staged 1.txt

<<<<<<< HEAD

3.3 --source将工作区内容切换到某个版本

=======

6.3.3 --source将工作区内容切换到某个版本

da878a6139b43db91fa05f06a21d78c2811c6e79

## git restore --source=<commit id> <path>
## 指定具体文件
$ git restore --source=9d213ac 3.txt
## .表示所有文件
$ git restore --source=9d213ac .

<<<<<<< HEAD

4 reset

  • 功能:将当前 HEAD 重置为指定状态

4.1 --mixed版本库->暂存区

=======

6.4 reset

  • 功能:将当前 HEAD 重置为指定状态

6.4.1 --mixed版本库->暂存区

da878a6139b43db91fa05f06a21d78c2811c6e79

git reset --mixed commit_id

<<<<<<< HEAD

4.2 --soft暂存区->工作区

=======

6.4.2 --soft暂存区->工作区

da878a6139b43db91fa05f06a21d78c2811c6e79

git reset --soft commit_id

<<<<<<< HEAD

4.3 --hard版本库、暂存区、工作区全撤销

git reset --hard commit_id

5 stash

=======

6.4.3 --hard版本库、暂存区、工作区全撤销

git reset --hard commit_id

6.5 stash

da878a6139b43db91fa05f06a21d78c2811c6e79

只能保存工作空间中已跟踪的文件的修改,未跟踪的文件(新建文件还没有add)不会暂存,依然存在

  • 功能:保存本地修改并恢复工作目录以匹配 HEAD 提交
  • 使用场景:再修改了一些工作空间的文件时,需要返回某个分支完成临时任务时,使用此命令暂存工作空间的修改文件 <<<<<<< HEAD

5.1 工作区->stash空间

=======

6.5.1 工作区->stash空间

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:

## 1. 添加到stash空间
git stash
## 2. 添加到stash空间且用注释标记
git stash save "messages"
<<<<<<< HEAD

5.2 显示stash存储的条目

=======

6.5.2 显示stash存储的条目

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:git stash list - 示例:

[root@centos7 git-test]## git stash list
stash@{0}: On master: modify file2
<<<<<<< HEAD

5.3 stash空间->工作区

=======

6.5.3 stash空间->工作区

da878a6139b43db91fa05f06a21d78c2811c6e79

pop 相比 apply 会将stash提交从stash记录中移除

  • 语法:
## 1. apply最近一次提交
git stash apply
## 2. apply指定提交,stash@{0}从 git stash list 获取,0表示最近一次提交,1表示倒数第2仅提交,以此类推
git stash apply <stash>
## 3. 应用最近一次提交,且删除最近一次提交记录
git stash pop
  • 示例:

[root@centos7 git-test]## git stash list
stash@{0}: WIP on master: 12b4062 commit 1
[root@centos7 git-test]## git stash apply stash@{0}
<<<<<<< HEAD

5.4 清理stash空间记录

=======

6.5.4 清理stash空间记录

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:

## 1. drop 最近一次提交
git stash drop
## 2. drop 指定提交
git stash drop <stash>
## 3. clear 所有提交
git stash list
  • 示例:

[root@centos7 git-test]## git stash drop
Dropped refs/stash@{0} (f2af911102a30a307603bda23a53a322b8fc7afc)
[root@centos7 git-test]## git stash drop stash@{0}
Dropped stash@{0} (21a63456be8106dfaa06dcb0de674512831f6805)
[root@centos7 git-test]## git stash list
stash@{0}: WIP on master: 12b4062 commit 1
stash@{1}: WIP on master: 12b4062 commit 1
[root@centos7 git-test]## git stash clear
[root@centos7 git-test]## git stash list
<<<<<<< HEAD

8 日志、比较

1 diff内容格式说明

2 比较工作区和暂存区不同

=======

7 日志、比较

7.1 diff内容格式说明

7.2 比较工作区和暂存区不同

da878a6139b43db91fa05f06a21d78c2811c6e79

只会列出已经在版本库中的文件的对比,未commit和add新文件不比较

  • 语法:git diff

$ git diff
diff --git a/2.txt b/2.txt
index e60ded9..f6be5d7 100644
--- a/2.txt
+++ b/2.txt
@@ -1,3 +1,3 @@
-1313
+3663
 b1 update...
-
+2
<<<<<<< HEAD

3 比较工作区和某一个提交

=======

7.3 比较工作区和某一个提交

da878a6139b43db91fa05f06a21d78c2811c6e79

1. 没有add到暂存区的新文件不会对比。
2. 已add的新文件但未commit的文件会对比。

  • 语法:git diff <commit>

## 2.txt是版本库已存在,但工作区更新了,还未add的;
## 4.txt是已经add但未commit的新文件
$ git diff HEAD
diff --git a/2.txt b/2.txt
index e60ded9..f6be5d7 100644
--- a/2.txt
+++ b/2.txt
@@ -1,3 +1,3 @@
-1313
+3663
 b1 update...
-
+2
diff --git a/4.txt b/4.txt
new file mode 100644
index 0000000..e69de29
<<<<<<< HEAD

4 比较暂存区和某一个提交

=======

7.4 比较暂存区和某一个提交

da878a6139b43db91fa05f06a21d78c2811c6e79

1. 新文件需要至少add了的

  • 语法:
  • git diff --cached <commit>
  • git diff --staged <commit>

## 4.txt是已add但未commit的新文件
$ git diff --cached HEAD
diff --git a/4.txt b/4.txt
new file mode 100644
index 0000000..e69de29
<<<<<<< HEAD

5 比较任意2个提交

=======

7.5 比较任意2个提交

da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:git diff <commit1> <commit2>

$ git diff HEAD 9d213ac
diff --git a/3.txt b/3.txt
deleted file mode 100644
index 3bd9bce..0000000
--- a/3.txt
+++ /dev/null
@@ -1 +0,0 @@
-3333
<<<<<<< HEAD

6 --stat简化对比结果

=======

7.6 --stat简化对比结果

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git diff --stat
 2.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
<<<<<<< HEAD

7 --限定比较的文件

=======

7.7 --限定比较的文件

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git diff  HEAD
diff --git a/2.txt b/2.txt
index e60ded9..f6be5d7 100644
--- a/2.txt
+++ b/2.txt
@@ -1,3 +1,3 @@
-1313
+3663
 b1 update...
-
+2
diff --git a/4.txt b/4.txt
new file mode 100644
index 0000000..e69de29
$ git diff  HEAD -- 4.txt
diff --git a/4.txt b/4.txt
new file mode 100644
index 0000000..e69de29
<<<<<<< HEAD

8 log和reflog比较

git log只能列出所有提交的日志信息,而git reflog会列出所有执行的操作日志信息

9 log

9.1 显示详细日志信息

=======

7.8 log和reflog比较

git log只能列出所有提交的日志信息,而git reflog会列出所有执行的操作日志信息

7.9 log

7.9.1 显示详细日志信息

da878a6139b43db91fa05f06a21d78c2811c6e79

## git log 不带任务选项会显示详细提交日志
$ git log
commit b55291b03f58247c3ec8dfd773166a662d00fb2e (HEAD -> main)
Author: shuhaiwen <shuhw@heredata.com.cn>
Date:   Fri Oct 8 09:26:05 2021 +0800

    add 3.txt

<<<<<<< HEAD

9.2 单行显示日志信息

=======

7.9.2 单行显示日志信息

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项:--oneline

## git log --oneline 单行显示日志信息
$ git log --oneline
b55291b (HEAD -> main) add 3.txt

<<<<<<< HEAD

9.3 限制日志数量

=======

7.9.3 限制日志数量

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项: - -<number> - -n <number> - --max-count=<number>

## 含3种方式
$ git log -n 2
$ git log --max-count 2
$ git log -2

<<<<<<< HEAD

9.4 过滤日志时间范围

=======

7.9.4 过滤日志时间范围

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项: - --since=<date> 指示在某一个时间之后的日志 - --after=<date> 指示在某一个时间之后的日志 - --until=<date> 指示在某一个时间之前的日志 - --before=<date> 指示在某一个时间之前的日志

## --since=<date> 指示在某一个时间之后的日志
## --after=<date> 指示在某一个时间之后的日志
## --until=<date> 指示在某一个时间之前的日志
## --before=<date> 指示在某一个时间之前的日志
$ git log --since="2021-10-07" --oneline
b55291b (HEAD -> main) add 3.txt
$ git log --before="2021-09-28" --oneline
efcfdb2 .gitignore
$ git log --after="2021-09-28" --before="2021-10-07" --oneline
9d213ac (tag: tag2) resolve merge 2.txt conflict
53cb60f (b1) branch b1 commit +2
71d793e Merge branch 'b1'
934c075 branch main commit
298fb37 branch b1 commit
1ad14b3 add 2 folder
2d5f9d0 merge commit 2,3,4

<<<<<<< HEAD

9.5 过滤作者

=======

7.9.5 过滤作者

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项:--author=[name]

$ git log --author="shuhaiwen" --oneline
b55291b (HEAD -> main) add 3.txt
9d213ac (tag: tag2) resolve merge 2.txt conflict
53cb60f (b1) branch b1 commit +2
71d793e Merge branch 'b1'
934c075 branch main commit
298fb37 branch b1 commit
1ad14b3 add 2 folder
2d5f9d0 merge commit 2,3,4
efcfdb2 .gitignore

<<<<<<< HEAD

9.6 过滤日志关键字

=======

7.9.6 过滤日志关键字

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项:--grep=[description]

$ git  log --grep="3.txt"
commit b55291b03f58247c3ec8dfd773166a662d00fb2e (HEAD -> main)
Author: shuhaiwen <shuhw@heredata.com.cn>
Date:   Fri Oct 8 09:26:05 2021 +0800

    add 3.txt

<<<<<<< HEAD

9.7 过滤合并提交日志

=======

7.9.7 过滤合并提交日志

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项: - --no-merges:排除合并提交 - --merges:只显示合并提交

$ git log --merges --oneline
9d213ac (tag: tag2) resolve merge 2.txt conflict
71d793e Merge branch 'b1'

## 以下会把合并提交9d213ac和71d793e过滤掉
$ git log --oneline --no-merges
b55291b (HEAD -> main) add 3.txt
53cb60f (b1) branch b1 commit +2
934c075 branch main commit
298fb37 branch b1 commit
1ad14b3 add 2 folder
2d5f9d0 merge commit 2,3,4
efcfdb2 .gitignore

<<<<<<< HEAD

9.8 过滤文件内容

=======

7.9.8 过滤文件内容

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项: - -S<string>:指定过滤内容 - -i:忽略大小写(默认大小写敏感)

$ git log -i -S"b1 update" -p
commit 53cb60f7e2a3f8e8e328c15850c72b0af330a31f (b1)
Author: shuhaiwen <shuhw@heredata.com.cn>
Date:   Wed Sep 29 17:46:50 2021 +0800

    branch b1 commit +2

diff --git a/2.txt b/2.txt
index 16e80ca..bdd4f02 100644
--- a/2.txt
+++ b/2.txt
@@ -1 +1,2 @@
 1313
+b1 update...

<<<<<<< HEAD

9.9 日志显现变更差异

=======

7.9.9 日志显现变更差异

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项:-p

$ git log -p
commit b55291b03f58247c3ec8dfd773166a662d00fb2e (HEAD -> main)
Author: shuhaiwen <shuhw@heredata.com.cn>
Date:   Fri Oct 8 09:26:05 2021 +0800

    add 3.txt

diff --git a/3.txt b/3.txt
new file mode 100644
index 0000000..3bd9bce
--- /dev/null
+++ b/3.txt
@@ -0,0 +1 @@
+3333

<<<<<<< HEAD

9.10 以图视显示提交日志

=======

7.9.10 以图视显示提交日志

da878a6139b43db91fa05f06a21d78c2811c6e79 - 关键选项:--graph - 类似TortoiseGit软件显示的提交历史

## --graph 以图形式显示
$ git log --graph --oneline
* b55291b (HEAD -> main) add 3.txt
*   9d213ac (tag: tag2) resolve merge 2.txt conflict
|\
| * 53cb60f (b1) branch b1 commit +2
* | 71d793e Merge branch 'b1'
|\|
| * 298fb37 branch b1 commit
* | 934c075 branch main commit
|/
* 1ad14b3 add 2 folder
* 2d5f9d0 merge commit 2,3,4
* efcfdb2 .gitignore

<<<<<<< HEAD

10 reflog

=======

7.10 reflog

da878a6139b43db91fa05f06a21d78c2811c6e79

$ git reflog
b55291b (HEAD -> main) HEAD@{0}: reset: moving to b55291b
62c0dd2 HEAD@{1}: checkout: moving from b1 to main
53cb60f (b1) HEAD@{2}: checkout: moving from main to b1
62c0dd2 HEAD@{3}: checkout: moving from b1 to main
53cb60f (b1) HEAD@{4}: checkout: moving from main to b1
62c0dd2 HEAD@{5}: commit: add 4.txt
b55291b (HEAD -> main) HEAD@{6}: commit: add 3.txt
9d213ac (tag: tag2) HEAD@{7}: reset: moving to 9d213ac

8 git常见问题

<<<<<<< HEAD

1 commit多行提交

=======

8.1 commit多行提交

da878a6139b43db91fa05f06a21d78c2811c6e79 1. 在-m 后使用单引号,将会自动换行,再以单引号结尾

$ git commit -m '
> 1. 测试注释行1
> 2. 测试注释行2'
[main 37bc086] 1. 测试注释行1 2. 测试注释行2
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 3.txt
$ git log
commit 37bc0866b9f51b7264fbc181b91c4ce07c67eb7d (HEAD -> main)
Author: shuhaiwen <shuhw@heredata.com.cn>
Date:   Fri Jul 23 15:28:17 2021 +0800

    1. 测试注释行1
    2. 测试注释行2
<<<<<<< HEAD

2 修改最后一次提交注释

git commit --amend -m '改变最后一次提交'

3 OpenSSL SSL_read: Connection was reset

=======

8.2 修改最后一次提交注释

git commit --amend -m '改变最后一次提交'

8.3 OpenSSL SSL_read: Connection was reset

da878a6139b43db91fa05f06a21d78c2811c6e79 可能由代理产生,移除代理。 - 示例

git config --global --unset-all remote.origin.proxys
<<<<<<< HEAD

4 winodw系统,git远程命令操作没有提示输入密码

=======

8.4 winodw系统,git远程命令操作没有提示输入密码

da878a6139b43db91fa05f06a21d78c2811c6e79 - 原因:windows下有个凭证管理器,里面记录了之前输入的git账户、密码 - 解决: - 进入 控制面板->凭证管理器->Winodws凭证 下,找到相应的git凭证,删除。(此步只能还原到要输入用户密码,但还会弹窗凭证管理器) - 卸载Windows版的Git Credential Manager:进入Git的安装目录下的mingw64\libexec\git-core,执行git credential-manager uninstall,安装提示删除。(此步骤解决弹窗凭证管理器问题)