Git学习笔记
记一些Git学习时的笔记供之后参考。
FAQ
快速合并和非快速合并的区别
理解概念:https://blog.csdn.net/andyzhaojianhui/article/details/78072143
理解区别:https://blog.csdn.net/zombres/article/details/82179122
Git远程操作
查看/设置远程仓库
- 查看远程分支引用列表:
git ls-remote
54f42552f530fe64acdf71e68c5de3b8ac1b9184 HEAD
54f42552f530fe64acdf71e68c5de3b8ac1b9184 refs/for/master
54f42552f530fe64acdf71e68c5de3b8ac1b9184 refs/heads/master - 查看本地仓库已经配置的远程仓库信息:
git remote -v
- 查看远程仓库详细信息:
git remote show [remote-name]
- 添加远程仓库:
git remote add <remote-name> <url>
添加远程仓库URL,并设置一个简写的远程仓库名称,这个名称代替整个URL。这里的remote-name可以任意命名,通过git clone
命令下来的仓库,其remote-name为origin。 - 修改远程仓库URL:
git remote set-url [remote-name] [url]
git remote
命令手册:
git remote [-v | –verbose]
git remote add [-t] [-m ] [-f] [–[no-]tags] [–mirror=<fetch|push>]
git remote rename
git remote remove
git remote set-head(-a | –auto | -d | –delete | )
git remote set-branches [–add]…
git remote get-url [–push] [–all]
git remote set-url [–push][ ]
git remote set-url –add [–push]
git remote set-url –delete [–push]
git remote [-v | –verbose] show [-n]…
git remote prune [-n | –dry-run]…
git remote [-v | –verbose] update [-p | –prune] [(| )…]
拉取远程仓库信息
git fetch
git fetch <remote-name>
拉取某个远程远程仓库信息,例如:git remote origin
,git fetch --all
拉取本地仓库所有绑定的远程仓库信息。git fetch
会将该远程仓库的所有信息(本地没有的)拉取到本地仓库中,更新所有远程分支的提交引用(但不用合并代码)。
git pull
git pull
命令,拉取远程主机某个分支的提交更新。命令为:git pull <remote-name> <branch-name>
如果本地分支设置了远程的跟踪分支(上游),那么可以直接使用git pull
。git pull
会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
Git常用撤销操作
- 撤销文件暂存状态:
git reset HEAD <file>
- 撤销对文件的修改:
git checkout -- <file>
Git重置
git reset 命令
git reset命令有3种形式.
git reset [-q] [<tree-ish>] [--] <paths>...
git reset (--patch | -p) [<tree-ish>] [--] [<paths>...]
git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
这里将1、2两种带有paths的形式称为基于路径的使用方式,将第3种带有commit的形式称为基于提交记录的使用方式。
根据这2种使用方式,在平时使用时有两种使用场景:
重置暂存区 ,撤销文件暂存。(不会移动HEAD分支指向)
git reset HEAD -- paths
或者直接git reset HEAD
,由于reset参数默认是--mixed
级别,表示将HEAD中的文件状态复制到暂存区。也就是相当于撤销了新文件的暂存,取消了git add
命令的操作。这个命令执行完成后,文件的状态是被修改但未暂存(Changes not staged)。用来将当前分支的HEAD指针移动到某个提交上
这种使用方式会根据传递的选项来决定进行什么样的操作, 但都会先将分支的HEAD指针进行移动. 移动的后续操作取决于传入的是--mixed
还是--soft
或是--hard
.--soft
仅仅是移动HEAD指针到某次提交上, 暂存区和工作区不受影响,表示仅仅撤销提交, 重置前如果有加入到暂存区的文件会依旧保留在暂存区, (表示我们希望撤销git commit
)--mixed
移动HEAD指针后, 如果重置前有加入到暂存区的文件, 那么会被取消暂存, 但工作区不受影响. (表示我们希望撤销git commit
以及git add
)--hard
在移动HEAD指针后, 会将暂存区及工作区都重置为对应提交记录的状态上去. (撤销git commit
、git add
以及工作区所有的修改)
关于git reset [–soft | –mixed | –hard] 命令操作过程:
首先git reset命令的三个选项都会将当前分支的HEAD指针进行移动.
--soft
仅仅是移动指针,不会对暂存区和工作区做修改,重置后,工作区和index中依旧是之前的文件状态。--mixed
移动HEAD指针后,再将对应HEAD指向的提交记录中的文件拷贝至index中,所以此时index与HEAD中文件内容一致。可以通过命令git diff --cached <path>
查看一下index与HEAD中的文件差异。这时候,工作区和index中的差异就是相对于HEAD中的差异,可以通过命令git diff <commit> <path>
查看一下。--hard
则在移动HEAD指针后先将HEAD中对应的内容复制到index中, 同时还会将index的内容复制给工作区.
https://www.git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E7%BD%AE%E6%8F%AD%E5%AF%86
Git检出
检出分支
从Tag检出分支:
git checkout -b [branchname] [tagname]
基于其他分支检出:
git checkout -b <new-branch-name> <base-branch-name>
- 如果基分支是远程分支,那么检出分支会建立绑定关系(设置其为跟踪分支或上游分支):
git checkout -b [branch][remotename]/[branch]
git checkout -b [branch][remotename]/[branch]
可简写为:git checkout --track [remotename]/[branch]
- 如果基分支是远程分支,那么检出分支会建立绑定关系(设置其为跟踪分支或上游分支):
撤销对未暂存文件的修改
命令:git checkout -- <file>
Git Tag 操作
- 查看tag列表:
git tag
- 查看tag信息:
git show <tag-name>
- 创建tag:
git tag -a v1.4 -m 'my version 1.4' <commit-id>
- 删除tag:
git tag -d <tag-name>
- 推送tag到远程:
git push origin <tag-name>
/ 推送本地所有tag:git push --tags
- 删除远程tag:
git push origin :refs/tags/<tag-name>
(将远程tag引用至空)
Git配置
git config section.key "配置值"
,例如git config user.name "Bennie Joey"
配置的3个级别,-e
表示编辑配置文件:
git config -e
当前仓库,优先级最高git config --global -e
当前用户git config --system -e
系统全局,优先级最低
git config --list
列出所有 Git 当时能找到的配置。
配置别名
- 命令配置:
git config --global alias.<别名> '命令内容'
,如:git config --global alias.st 'status'
- 手动配置:
git config -e --global
编辑配置文件,加入到”[alias]”节即可。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18ci = commit
cim = commit -m
co = checkout
cob = checkout -b
lgol = log --oneline
st = status
sts = status -s
a = !git add . && git status
au = !git add -u . && git status
aa = !git add . && git add -u . && git status
ca = commit --amend # careful
ac = !git add . && git commit
acm = !git add . && git commit -m
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
d = diff
alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\\t => \\2/' | sort
br = branch
unstage = reset HEAD --
Git分支操作
检出分支
- 分支可以从一个commit、tag、其他分支上进行基础。
- 创建分支,只是相当于从commit对象上建立了一个指针,然后让其内部的HEAD指针指向这个分支,就会知道当前工作区处于哪个分支上(可以将 HEAD 想象为当前分支的别名)。
远程分支操作
Git查看、删除、重命名远程分支和tag
https://blog.zengrong.net/post/delete_git_remote_brahch/
删除远程分支
第一种:
git push origin --delete <branch_name>
第二种:
git branch -r -d origin/
git push origin :
设置本地分支的远程跟踪分支
设置后可以直接在当前分支上使用git pull
、git push
。
- 从远程分支检出本地分支(会自动设置远程分支为跟踪分支),见:检出分支
- 修改或者本地分支的远程跟踪分支:
git branch -u/--set-upstream-to origin/远程分支名x
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
- 查看本地分支的远程跟踪分支信息:
git branch -vv
这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。
Git信息查看
查看历史提交信息
Git log命令
git log <file-path>
查看单个文件/目录的提交记录git log --flow <file-path>
追溯文件全部历史,包括删除、重命名文件名。、git log pretty=oneline/short/full/fuller/format:<格式化>
,format参数如下:
选项 | 说明 |
---|---|
%H |
提交对象(commit)的完整哈希字串 |
%h |
提交对象的简短哈希字串 |
%T |
树对象(tree)的完整哈希字串 |
%t |
树对象的简短哈希字串 |
%P |
父对象(parent)的完整哈希字串 |
%p |
父对象的简短哈希字串 |
%an |
作者(author)的名字 |
%ae |
作者的电子邮件地址 |
%ad |
作者修订日期(可以用 –date= 选项定制格式) |
%ar |
作者修订日期,按多久以前的方式显示 |
%cn |
提交者(committer)的名字 |
%ce |
提交者的电子邮件地址 |
%cd |
提交日期 |
%cr |
提交日期,按多久以前的方式显示 |
%s |
提交说明 |
git log常用命令选项
选项 | 说明 |
---|---|
-(n) |
仅显示最近的 n 条提交 |
--since , --after |
仅显示指定时间之后的提交。 |
--until , --before |
仅显示指定时间之前的提交。 |
--author |
仅显示指定作者相关的提交。 |
--committer |
仅显示指定提交者相关的提交。 |
--grep |
仅显示含指定关键字的提交 |
-S |
仅显示添加或移除了某个关键字的提交 |
查看对象库信息
git show <branch>
命令使用
底层命令
git cat-file
查看对象内容1
2
3
4-t 查看对象类型。类型可以是blob, tree, commit, tag其中之一
-s 显示对象大小
-e exit with zero when there's no error
-p 打印对象内容git ls-files
浏览文件内容。1
2
3
4
5
6
7
8
9
10
11
12-z paths are separated with NUL character
-t identify the file status with tags
-v use lowercase letters for 'assume unchanged' files
-f use lowercase letters for 'fsmonitor clean' files
-c, --cached 显示已被暂存的文件。
-d, --deleted 显示已经被删除的文件。
-m, --modified 显示被修改的文件。
-o, --others show other files in the output
-i, --ignored 显示被忽略的文件。
-s, --stage show staged contents' object name in the output
-k, --killed 显示文件系统上需要被移除的文件
--directory show 'other' directories' names onlygit rev-parse
将标签、相对名、简写或绝对名称转成实际的提交散列ID。
git rm命令
git rm <file> --cached
移除索引中已经暂存的文件(工作区文件依旧保留)。git rm <file>
移除索引和工作区的文件。(文件需要被暂存)git rm -f <file>
-f命令 表示在删除之前已存在被加到暂存区的文件一样会被强制移除。
git diff 命令
该命令用来查看文件的不同.
git diff <file>
查看工作区相对于暂存区作出的更改。(默认)git diff <commit> <file>
查看工作区与指定提交的文件差异git diff --cached [<commit>] <file>
查看暂存区与HEAD或指定提交中的差异。git diff <commit> <commit>
查询两次提交中的文件差异。
git diff <file>
表示查看工作区相对于暂存区的差异:
1 | git diff t.txt |