git的常用命令
原来git中的checkout命令承载了分支操作和文件恢复的部分功能,有点复杂,并且难以使用和学习,所以社区解决将这两部分功能拆分开,在git 2.23.0中引入了两个新的命令switch和restore用来取代checkout
常用命令
配置
设置
git config --global/local user.name "Name"
git config --global/local user.email "Email"
查看
git config --global/local --list
查看所有配置git config --global/local user.name
单独查看user.name的配置,user.email同理
查看版本历史
-
git log
当前分支的历史记录 -
git log BranchName
查看指定分支的历史记录 -
git log --oneline
记录只以展示一行的简略形式展示 -
git log --oneline -n4
查看最近4次记录, n后面接查看最近记录的条数,这里n可以省略 -
git log --all
查看所有分支的历史记录 -
git log --all --graph
图形化历史记录,方便查看分支演变 -
git log --help --web
打开help网页 -
git cat-file -t sha1_id
查看sha1_id对应对象的类型 -
git cat-file -p sha1_id
查看sha1_id对应对象的内容
commit
git commit --amend
修改最后一次commit信息。用于未push之前的修改操作。
分支
创建分支
git checkout -b name
根据当前分支创建分支git chekcout -b name BranchName
根据某个分支创建分支git checkout -b name sha1_id
根据sha1_id创建分支
切换分支
git chekcout BranchName
查看分支
git branch -v
git branch -av
列出当前分支与远程分支。
以下示例中有两个远程仓库:github和origin
git branch -vv
git查看本地分支对应哪个远程分支。
以下示例中当前分支对应着远程仓库github的master分支。如果用git push的话,是推送到github/master中。如果需要推送到远程origin/master(如上例),则需用git push origin master
在push时指明推送到远程origin仓库。
删除分支
git branch -d BranchName
远程分支
git remote -v
查看是否有远程分支git branch -av
查看所有分支,包括远程分支git branch -vv
查看分支对应的远程分支remote
git remote add <远程仓库名> <URL>
一般这个<远程仓库名>设置成origingit push -u <远程仓库名> <本地分支名>:<远程分支名>
如果远程分支名被省略,则表示将本地分支推送到与之存在追踪关系(即-u的含义)的远程分支(通常两者同名)。如果该远程分支不存在,则会被新建。git push --set-upstream <远程仓库名> <本地分支名>
git branch --set-upstream-to <远程仓库名>/<远程分支名> <本地分支名>
关联本地分支和远程分支
git推送本地分支到远程分支举例
场景:有时候我们开发需要开一个分支,这样可以有效的并行开发。
两种开分支方式: 一种是在远程开好分支,本地直接拉下来;一种是本地开好分支,推送到远程。
- 远程开好分支然后拉到本地
- git checkout -b feature-branch origin/feature-branch //检出远程的feature-branch分支到本地
- 本地先开好分支然后推送到远程
git checkout -b feature-branch
//创建并切换到分支feature-branchgit push origin feature-branch:feature-branch
//推送本地的feature-branch(冒号前面的)分支到远程origin的feature-branch(冒号后面的)分支(没有会自动创建)
比较差异
-
git diff
暂存区和工作区的区别 -
git diff -- FileName
比较FileName在暂存区和工作区中的区别 -
git diff -- FileName1 FileName2
比较FileName1, FileName2在暂存区和工作区中的区别 -
git diff --cached
比较暂存区和HEAD之间的差异 -
git diff --cached FileName
比较FileName在暂存区和HEAD之间的差异 -
git diff sha1_id1 sha1_id2
比较sha1_id2和sha1_id1对应的对象之间的差异 -
git diff HEAD^ HEAD
比较HEAD和父commit之间的差异。 -
git diff HEAD^^ HEAD
比较HEAD和祖父commit之间的差异 -
git diff HEAD~n HEAD
比较HEAD和父n个commit之间的差异 -
git diff BranchName1 BranchName2
比较分支之间的差异,这里的BranchName可以换成对应的sha1_id。 -
git diff BranchName1 BranchName2 -- FileName
比较FileName在不同分支之间的差异
git reset撤销暂存区的修改
(git restore --staged
代替了git reset HEAD
)
git restore --staged FileName
git reset HEAD
撤销暂存区的修改,全部文件变成HEAD一样git reset HEAD -- FileName
撤销暂存区的修改,FileName变成HEAD一样git reset --hard sha1_id
工作区和暂存区都恢复到sha1_id对应的状态,撤销最近几次commit的内容git reset --hard HEAD
工作区和暂存区都恢复到HEAD
git checkout撤销工作区的修改
(git restore
代替了git checkout
)
git checkout -- FileName
撤销工作区的修改,FileName恢复成暂存区一样
变基
git rebase工作的过程中,就是用了分离头指针。rebase意味着基于新base的commit来变更部分commits。它处理的时候,把HEAD指向base的commit,此时如果该commit没有对应branch,就处于分离头指针的状态,然后重新一个一个生成新的commit,当rebase创建完最后一个commit后,结束分离头状态,Git让变完基的分支名指向HEAD。
git rebase -i sha1_id
对sha1_id对应的子对象变更git rebase -i --root
git rebase --abort
放弃正在进行中的rebase
git stash
git stash
将当前的修改存到堆栈中git stash list
git stash apply
git stash pop
备份
git clone --bare
克隆裸仓库(.git文件夹),不包含工作区
裸仓库对代码平台的作用:http://www.worldhello.net/gotgit/02-git-solo/100-git-clone.html#id4
其它
列出所有跟踪的文件
git ls-files
不再跟踪文件
git rm --cached fileName
保留文件,只是git不再跟踪git rm -f fileName
删除文件,同时git不再跟踪
撤回git init
rm -rf .git
删除.git路径中所有的内容就等于撤销了git跟踪
git fetch
git merge /
git push -all # 所有分支
打标签
git tag
列出已有标签git tag -a TagName -m "note"
创建标签git tage -a TagName 某个commit地址
对历史打标签git show TagName
查看对应标签信息git tag -d TagName
删除标签
远程推送&删除标签
git push origin TagName
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样——你可以运行 git push origin TagNamegit push --tags
推送所有标签git push origin --delete TagName
远程删除某个标签