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~
:指提交62c0dd2HEAD~2
==HEAD~~
==HEAD~2^
:指提交b55291bHEAD~2^
:指提交71d793eHEAD~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
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
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
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
<<<<<<< HEAD## 创建不带注释标签 git tag tag1 ## 创建带注释的标签 git tag -a v1 -m "v1 标签"
1.2 查看标签¶
=======
4.1.2 查看标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 显示所有分支 git tag ## 显示指定分支信息 git show tag2
1.3 删除标签¶
=======
4.1.3 删除标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD$ git tag -d tag1 Deleted tag 'tag1' (was 9d213ac)
1.4 推送远程仓库标签¶
=======
4.1.4 推送远程仓库标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 将标签t1推送到远程仓库origin,命名标签t1 git push origin t1 ## 将标签t1推送到远程仓库origin,并命名标签rt2 git push origin t2:rt2 ## 推送所有标签 git push origin --tags
1.5 删除远程仓库标签¶
=======
4.1.5 删除远程仓库标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 删除远程仓库rt2标签 git push origin --delete rt2 ## 推送空标签达到删除远程标签作用 git push origin :refs/tags/rt2
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
2 branch¶
2.1 显示分支¶
=======
4.2 branch¶
4.2.1 显示分支¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 显示当前分支 git branch ## 显示所有分支(包括远程分支和本地分支)(远程分支在本地仓库,使用前git fetch可以抓取更新远程分支到本地) git branch -a ## 显示所有远程跟踪分支 git branch -r ## 显示已合并分支 git branch --merged ## 显示未合并分支 git branch --no-merged
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
<<<<<<< HEAD## 分支未被合并会报错 git branch -d branch1 ## 强制删除分支(包括未合并分支) git branch -D branch1
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
2.6 显示远程分支和本地分支关系¶
=======
4.2.6 显示远程分支和本地分支关系¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEADgit 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)
2.7 删除远程分支¶
=======
4.2.7 删除远程分支¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 方式1:删除远程分支 branch1,其中冒号:前需要空一格,且删除的分支不能是远程仓库的默认分支 git push origin :branch1 ## 方式2: git push [remote] --delete [remote_branch]
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
2.9 查看所有跟踪分支¶
=======
4.2.9 查看所有跟踪分支¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD$ 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)
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
3 switch¶
=======
4.3 switch¶
da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:切换分支
git switch branch1
4 checkout¶
4.1 切换分支¶
=======
4.4 checkout¶
4.4.1 切换分支¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 切换分支(在branch1分支上) git checkout branch1
4.2 创建新分支的同时切换过去¶
=======
4.4.2 创建新分支的同时切换过去¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 创建新分支的同时切换过去 git checkout -b branch2
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
<<<<<<< HEAD## 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
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
- 假设保留HEAD分支数据,
1.txt
文件变动如下
branch main uodate
1.txt
- 重新add
1.txt
文件,并commit(合并产生冲突时,冲突文件会从暂存区移除,所以需要重新添加到暂存区)
git add 1.txt
git commit -m "resolve merge 1.txt conflict"
6 mergetool¶
=======
4.6 mergetool¶
da878a6139b43db91fa05f06a21d78c2811c6e79 - 功能:运行合并冲突解决工具来解决合并冲突
git mergetool
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
<<<<<<< HEAD$ 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
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
<<<<<<< HEAD## 默认远程仓库名为origin,分支为你克隆的分支名,且在本地创建master分支 git clone [url]
1.2 指定分支克隆¶
=======
5.1.2 指定分支克隆¶
da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法 -
git clone -b 分支名 url
- 示例
git clone -b main https://github.com/shuhaiwen/shuhaiwen.github.io.git
1.3 命名远程仓库名¶
=======
5.1.3 命名远程仓库名¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## -o 远程仓库名 修改默认仓库名origin $ git clone -o remote https://gitee.com/shuhaiwen/git-test.git $ git remote remote
1.4 指定本地库目录名¶
=======
5.1.4 指定本地库目录名¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 克隆仓库到test目录下,默认目录和是远程仓库名git-test同名 git clone https://gitee.com/shuhaiwen/git-test.git test
1.5 不拉取标签¶
=======
5.1.5 不拉取标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## --no-tags 表示不拉取标签(默认是拉取标签),同时设置config文件remote.<remote>.tagOpt=--no-tags ,隐式pull和fetch也不会拉取标签 git clone https://gitee.com/shuhaiwen/git-test.git --no-tags
2 fetch¶
=======
5.2 fetch¶
da878a6139b43db91fa05f06a21d78c2811c6e79
fetch和pull功能一样,pull相对于先fetch再merge
- 功能:从远程仓库更新本地库 <<<<<<< HEAD
2.1 更新本地仓库¶
=======
5.2.1 更新本地仓库¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 1.更新远程分支到本地(不删除本地保存的已失效的远程分支) git fetch [remote-name] ## 2.更新远程分支到本地(同时删除本地保存的已失效的远程分支) git fetch --prune ## 3.更新所有分支 git fetch --all
2.2 更新本地仓库但不更新标签¶
=======
5.2.2 更新本地仓库但不更新标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79 - 默认拉取分支时会把标签也拉取下来
## -n或--no-tags选项不拉取标签(远程仓库有新标签,也不会拉取下来,默认会拉取)
$ git fetch --no-tags
3 pull¶
- 功能:从远程仓库更新本地库,并进行必要的合并
3.1 更新本地仓库¶
=======
5.3 pull¶
- 功能:从远程仓库更新本地库,并进行必要的合并
5.3.1 更新本地仓库¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 1.更新远程分支到本地(不删除本地保存的已失效的远程分支) git pull [remote-name] ## 2.更新远程分支到本地(同时删除本地保存的已失效的远程分支) git pull --prune ## 3.更新所有分支 git pull --all
3.2 更新本地仓库但不更新标签¶
=======
5.3.2 更新本地仓库但不更新标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79 - 默认拉取分支时会把标签也拉取下来
## -n或--no-tags选项不拉取标签(远程仓库有新标签,也不会拉取下来,默认会拉取)
$ git pull --no-tags
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^{}
4.1 显示远程分支¶
=======
5.4.1 显示远程分支¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 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
4.2 显示远程标签¶
=======
5.4.2 显示远程标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 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^{}
5 remote¶
- 功能:管理远程仓库
5.1 查看远程仓库¶
=======
5.5 remote¶
- 功能:管理远程仓库
5.5.1 查看远程仓库¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 指定远程仓库 git remote show [remote-name] ## 所有远程仓库信息 git remote -v
5.2 移除/添加/重命名远程仓库关联¶
=======
5.5.2 移除/添加/重命名远程仓库关联¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEADgit remote rm [remote-name] git remote add [remote-name] https://github.com/<REPO> git remote rename [old-name] [new-name]
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
6.3 删除远程分支¶
=======
5.6.3 删除远程分支¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 方式1:删除远程分支 branch1,其中冒号:前需要空一格,且删除的分支不能是远程仓库的默认分支 git push origin :branch1 ## 方式2: git push [remote] --delete [remote_branch]
6.4 推送远程仓库标签¶
=======
5.6.4 推送远程仓库标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 将标签t1推送到远程仓库origin,命名标签t1 git push origin t1 ## 将标签t1推送到远程仓库origin,并命名标签rt2 git push origin t2:rt2 ## 推送所有标签 git push origin --tags
6.5 删除远程仓库标签¶
=======
5.6.5 删除远程仓库标签¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD## 删除远程仓库rt2标签 git push origin --delete rt2 ## 推送空标签达到删除远程标签作用 git push origin :refs/tags/rt2
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适用于某次提交有误,需要删除此次提交的场景。
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
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 .
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"
5.2 显示stash存储的条目¶
=======
6.5.2 显示stash存储的条目¶
da878a6139b43db91fa05f06a21d78c2811c6e79 - 语法:
git stash list
- 示例:
[root@centos7 git-test]## git stash list
stash@{0}: On master: modify file2
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}
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
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
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
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
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
6 --stat简化对比结果¶
=======
7.6 --stat简化对比结果¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD$ git diff --stat 2.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
7 --限定比较的文件¶
=======
7.7 --限定比较的文件¶
da878a6139b43db91fa05f06a21d78c2811c6e79
<<<<<<< HEAD$ 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
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
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
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
,安装提示删除。(此步骤解决弹窗凭证管理器问题)