-
add
git add 文件名
#将工作区的文件添加到缓存区中 -
checkout
git checkout <name>
#切换到分级git checkout -b <name>
#创建并切换到分支git checkout -b totallyNotMain o/main
#创建一个名为totallyNotMain
的分支,它跟踪远程分支o/main
git checkout -- 文件名
#丢弃工作区的修改,意思就是,把 该文件在工作区的修改全部撤销,即让这个文件回到最近一次 git commit或 git add时的状态 -
merge
git merge <name> #将<name>合并到当前HEAD
git merge --no-ff -m '注释说明' 自己的分支名 将自己的分支代码合并到开发分支上
-
rebase
git rebase <name> #将<name> rebase到HEAD节点下
git rebase <target> <source> #将<source> rebase到<target>节点下
git rebase -i[--interactive] <node>... 交互式rebase,可以排序、删减节点
-
分离HEAD
cat .git/HEAD | git symbolic-ref HEAD#两个不同命令查看当前HEAD指向位置
git checkout <node> #检出HEAD到指定节点
git checkout HEAD^ #检出到HEAD的上一个节点
git checkout HEAD~n#检出到HEAD的前的第n个节点
-
撤销变更
git reset#在本地撤销变更,撤销后无记录
git revert#撤销与远程有关联的变更,撤销后增加新的记录
-
cherry-pick
git cherry-pick <node>...
#将一些提交复制到当前所在的位置 -
restore
git restore
<文件名> #使在工作空间但是不在暂存区的文件撤销更改(内容恢复到没修改之前的状态)git restore --staged
#将暂存区的文件从暂存区撤出,但不会更改文件的内容git restore [--worktree] a.txt
# 从staged中恢复a.txt到worktreegit restore --staged a.txt
# 从repo中恢复a.txt到stagedgit restore --staged --worktree a.txt
# 从repo中恢复a.txt到staged和worktreegit restore --source dev a.txt
# 从指定commit中恢复a.txt到worktree -
switch
git switch
<branchName>#切换分支git switch -c <branchName>
# 创建并切换到分支 -
提交技巧,在历史记录中修改内容
方法一:
git git rebase -i#将提交重新排序,然后把我们想要修改的提交记录挪到最前
git commit --amend#来进行一些小修改
git rebase -i
来将他们调回原来的顺序方法二:
git cherry-pick c2
git commit --amend
git cherry-pic c3
-
tag
git tag <name> [node]
#给某节点打标签为<name>git tag v1.0
#打标签git tag
#查看所有标签git show <tagname>
#可以查看某个标签的详细信息git tag <tagname>
#用于新建一个标签,默认为HEAD,也可以指定一个commit idgit tag -d <tagname>
#可以删除一个本地标签注意:
a.标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签
b.要删除远程标签,首先从本地删除:
git tag -d <tagname>
, 然后,从远程删除git push origin :refs/tags/<tagname>
-
bisect (用来查找哪一次代码提交引入了错误)
git bisect start [终点] [起点]
#"终点"是最近的提交,"起点"是更久以前的提交。它们之间的这段历史,就是查错的范围git bisect good
#表记当前检查的提交正常git bisect bad
#表记当前检查的提交异常git bisect reset
#推出错误检查 -
describe
git describe <ref># 由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来描述离你最近的锚点(也就是标签),
ref
可以是任何能被 Git 识别成提交记录的引用它输出的结果是这样的:
<tag>_<numCommits>_g<hash>
tag
表示的是离<ref>
最近的标签,numCommits
是表示这个ref
与tag
相差有多少个提交记录,hash
表示的是你所给定的ref
所表示的提交记录哈希值的前几位。当ref
提交记录上有某个标签时,则只输出标签名称 -
push
git push origin --tags
#一次性推送全部尚未推送到远程的本地标签git push origin <tagname>
#推送某个标签到远程git push <remote> <place>
#切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我git push origin <source>:<destination>
#这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支foo
或者HEAD~1
),指定了独立的来源和目的地,就可以组织出言简意赅的远程操作命令,如果你要推送到的目的分支不存在,Git 会在远程仓库中根据你提供的名称帮你创建这个分支git push origin :side
#通过给 push 传空值 source,成功删除了远程仓库中的foo
分支如果一定要修改公共历史,按如下步骤进行
-
在本地使用
git rebase -i
修改提交历史 -
使用
git push --force-with-lease
推送到远程仓库
-
使用
git push
命令会报错,不允许推送 -
使用
git push -- force
过于危险,有可能会覆盖其他人的推送 -
使用
git push --force-with-lease
,在推送之前,将检查本地版本与对应分支的远程版本是否匹配,这样,你就可以确保在重写历史时,不会意外地擦除其他人推送的更改
-
-
fetch
git push <remote> <place>
git fetch origin foo
#Git 会到远程仓库的foo
分支上,然后获取所有本地不存在的提交,放到本地的o/foo
上git fetch origin :bar
#如果 fetch 空 到本地,会在本地创建一个新分支 -
branch
git branch -u o/main foo #这样
foo
就会跟踪o/main
了。如果当前就在 foo 分支上, 还可以省略 foo:git branch -u o/main
git branch --set-upstream branch-name origin/branch-name
#建立本地分支和远程分支的关联git branch dev
#创建开发分支git branch
#查看分支git branch -a
#查看所有分支git branch -v
#查看分支,并带有提交码git branch -d 分支名
#删除分支 -
log
git log --graph
#命令可以看到分支合并图git log --oneline
#查看日志git log
查看提交的日志gitk
以图形化的方式展现提交的日志git log -1
查看最近的一次提交git log -2
查看最近的两次提交git log --oneline
查看提交的日志,一行显示git log --oneline --graph
查看提交的日志git log -1 -p
查看最近的一次提交git reflog
显示你所使用过的每一条命令git log --graph --pretty=oneline --abbrev-commit
查看提交的日志信息 -
remote
git remote -v
查看远程库信息 -
status
git status
查看文件的状态,所谓文件状态的变化就是文件在工作区,缓存区,版本库之间不断的迁移git status -u
查看状态 -
config
git config --global color.ui true
#让git显示颜色git config --global user.name [username]
修改用户姓名git config --global user.email [email]
修改用户邮箱git config --list
#查看所有配置git config --global alias.st status
#设置status的别名为st,git st 等价于 git status,下同git config --global http://alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global core.excludesfile '~/.gitignore'
#配置全局忽略的文件,这样就不用每个项目都加gitignore -
diff
git diff
#来比较工作区与缓存区之间的差异git diff --cached
#来比较缓存区与版本库之间的差异git diff HEAD
#比较工作区与版本库之间的差异git diff 文件名
#查看某个文件在工作区与缓存区之间的差异git diff HEAD -- filename
#可以查看工作区和版本库里面最新版本的区别git diff 远程开发分支名 自己的分支名
#查看自己的分支与远程开发分支有什么不同git diff origin/develop develop
#查看开发分支有什么不同(develop:开发分支名) -
stash
git stash / git stash save
# 修改某个文件后,将它暂存起来git stash list
#查看存储了哪些暂存工作git stash apply
#恢复暂存起来的工作:git stash clear
#清除暂存起来的工作:
常见问题解决:
-
push遇到在输入密码是熟错后,就会报这个错误fatal: Authentication failed for,解决办法: git config --system --unset credential.helper 之后你在push就会提示输入名称和密码
-
ssl证书失效,不验证设置
git config --global http.sslVerify false
git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH #返回到某个节点,不保留修改,已有的改动会丢失。
git reset --soft HASH #返回到某个节点, 保留修改,已有的改动会保留,在未提交中,git status或git diff可看。
git clean -df #返回到某个节点,(未跟踪文件的删除)
git clean 参数
-n 不实际删除,只是进行演练,展示将要进行的操作,有哪些文件将要被删除。(可先使用该命令参数,然后再决定是否执行)
-f 删除文件
-i 显示将要删除的文件
-d 递归删除目录及文件(未跟踪的)
-q 仅显示错误,成功删除的文件不显示
注:
git reset 删除的是已跟踪的文件,将已commit的回退。
git clean 删除的是未跟踪的文件
git clean -nxdf(查看要删除的文件及目录,确认无误后再使用下面的命令进行删除)
git checkout . && git clean -xdf