git常用命令
简介
git是一个版本管理工具,共有四个分区:工作区
、暂存区
、本地仓库(本地版本库)
、远程仓库(远程版本库)
分区
-
工作区(Workspace)
工作区(Workspace)即本地代码所在的目录,同时也是存放 .git/ (本地仓库)的目录。
-
暂存区(Index/Stage)
暂存区(Index/Stage)是工作区和本地仓库的缓存空间,里面记录着即将提交给本地仓库(版本库)的文件修改信息,.git/ 目录里的index文件就是暂存区。
-
本地仓库(Repository)
本地仓库(Repository)也称本地库或版本库,存放了本地的所有版本(commit提交记录),本地仓库的文件都在 .git/ 目录中。
-
远程仓库(Remote)
远程仓库(Remote)在网络上,GitHub、Gitee和GitLab都能创建远程仓库,和本地仓库一样,远程仓库存放的也是不同的代码版本,只是这些版本可以来自多个本地仓库。
工作流程
常用命令
git clone
当我们有一个新项目,需要从远端拉取到本地开发时,就需要使用git clone
命令。
$ git clone <版本库的网址>
如上图该命令将远程仓库代码拉取到本地仓库,会在本地生成一个与远程版本库同名的目录,如果要修改目录名称,可以指定目录名。
$ git clone <版本库的网址> <本地目录名>
如果需要拉取指定分支代码可以指定分支:
$ git clone -b <分支名> <版本库的网址>
git remote
查看远程主机名
$ git remote
使用-v
选项,可以查看远程主机的网址。
$ git remote -v
git fetch
当远端有更新,我们需要拉取远端所有分支代码,但又不想更新本地分支时,就需要使用git fetch
命令。
$ git fetch <远程主机名>
该命令将代码拉取到本地仓库,本地主机上要用"远程主机名/分支名"的形式读取,并不会
对本地开发代码产生影响。
如果要取回指定分支的更新,可以指定第二个参数。
$ git fetch <远程主机名> <分支名>
git pull
当我们需要拉取远端某个分支的更新,并与本地指定分支进行合并,就需要使用git pull
命令。他的完整写法如下:
$ git pull <远程主机名> <远程分支名>:<本地分支名>
该命令将取回远程主机
的远程分支
,与本地分支
合并,保存到工作区。
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull <远程主机名> <远程分支名>
如果远端删除的分支本地也需要删除,可以将git pull
命令加上参数-p
.
$ git pull -p
git add
git add
命令将文件添加到暂存区。
添加一个或多个文件:
$ git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录:
$ git add [dir]
添加当前目录下的所有文件到暂存区:
$ git add .
git status
git status
命令用于查看上次提交之后是否有对文件进行再次修改。
$ git status
git commit
git commit
命令会将暂存区文件添加到本地仓库:
$ git commit -m [message]
如果想提交暂存区指定文件到本地仓库,可以执行如下命令:
$ git commit [file1] [file2] ... -m [message]
如果觉得使用git add
提交太复杂,可以增加-a
参数,跳过这一步,仅对修改和删除的文件有效,新增的文件还是需要使用git add
$ git commit -a
例如:
$ git commit -am 直接提交
git push
当我们要把本地仓库的代码推到远程仓库时,需要使用git push
命令,他的完整格式如下:
$ git push <远程主机名> <本地分支名>:<远程分支名>
当本地分支与远端分支同名时,冒号后面可以省略:
$ git push <远程主机名> <本地分支名>
如果需要强制推送可以增加-f
参数,例如:
$ git push -f origin test
git log
git log
命令用于查看历史提交记录,输入q
退出
$ git log
增加--oneline
参数将展示简洁版
$ git log --oneline
git relog
git relog
命令用于查看每一次命令,包括被回退的记录,输入q
退出
$ git relog
git reset
当我们发现commit有错误,要回退代码到指定版本时,需要使用git reset
命令,此命令也可以达到合并多个commit的目的。
$ git reset [--soft | --mixed | --hard] [HEAD]
参数说明
-
git reset --soft
仅仅移动当前
Head
指针,不会改变工作区
和暂存区
的内容。即回退后修改内容还在,为已经add状态,也可以达到合并多个commit的目的。
-
git reset --mixed
此为默认方式,等同于
git reset
。仅仅移动HEAD
指针,改变暂存区
内容,但不会改变工作区
内容。即回退后修改内容还在,为还未add状态,也可以达到合并多个commit的目的。
-
git reset --hard
当前
HEAD
指针、工作区
和暂存区
内容全部改变。即回退后修改内容不在,
工作区
和暂存区
记录全被删除。
HEAD说明
- HEAD 表示当前版本
- HEAD^ 上一个版本
- HEAD^^ 上上一个版本
- HEAD^^^ 上上上一个版本
- 以此类推…
也可以用~数字
表示
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD~2 上上一个版本
- HEAD~3 上上上一个版本
- 以此类推…
也可以使用git log
命令查看commitId
,直接指定commitId
。
撤销回退
当我们发现回退错了节点,git log
命令已经查看不到指定节点后的记录了,这时需要使用git relog
命令查看commitId
,再使用git reset
命令回退到指定commitId
。
git revert
当我们需要撤销中间某一次提交,而不是撤销指定节点后的所有提交时,需要使用git revert
命令。
如上图,如果我们想仅撤销commit_2
这次提交,不影响commit_3
和commit_4
,需要先查到commitId,然后进行撤销:
$ git revert commit_hash_2
然后进行提交,将生成一条新的commit,之前的记录还在。
当有多个commit需要撤销,连续的时候使用命令:
$ git revert -n commit_id_start..commit_id_end
不连续的时候使用:
$ git revert -n commit_id_1
$ git revert -n commit_id_3
如果要撤销的commit是一次merge commit
,merge commit
包含了两个 parent commit
,此时需要增加-m
参数,否则会报错。
如上图,我们当前在dev1分支
,如果我们想仅撤销commit_3
这次提交,他就是一次merge commit
,需要执行如下命令:
$ git revert commit_id_3 -m 1
参数1
的意思是保留主分支,即保留dev1分支
。
git branch
查看本地已存在分支
$ git branch
查看远程分支
$ git branch -r
查看所有分支(包括本地和远程分支)
$ git branch -a
创建本地分支,不会切换分支
$ git branch <分支名>
如果想创建之后切换分支需要使用:
$ git checkout -b <分支名>
分支重命名,如果新分支名已存在,需要使用-M
会强制重命名,正常情况使用-m
即可
$ git branch -m <旧分支名> <新分支名>
删除本地分支,使用-D
会强制删除,正常情况使用-d
即可
$ git branch -d <分支名>
删除远程分支时需要加上参数-r
$ git branch -d -r <分支名>
git checkout
切换本地分支
$ git checkout <分支名>
创建并切换本地分支
$ git checkout -b <分支名>
放弃所有工作区修改
$ git checkout .
放弃所有工作区和暂存区修改
$ git checkout -f
git merge
当我们需要合并其他分支所有代码到当前分支时,需要使用git merge
命令
$ git merge <分支名>
merge commit 会包含两个commitId
git cherry-pick
git merge
可以合并所有代码,但是如果我们仅需要合并其中部分提交,这时可以采用git cherry-pick
命令
$ git cherry-pick <commitId>
如果commitId
参数填的是分支名
,则会将指定分支的最近一次提交,转移到当前分支。
例如有dev1和dev2两个分支:
a - b - c - d dev1
\
e - f - g dev2
现在dev1
分支想合并f
这次提交,需要切换分支到dev1
分支,然后执行:
$ git cherry-pick f
合并后变成:
a - b - c - d - f dev1
\
e - f - g dev2
如果要一次合并多个commit,可以使用:
$ git cherry-pick <commitId_1> <commitId_2> ...
也可以是连续的commit:
$ git cherry-pick <commitId_start>..<commitId_end>
此命令不包含commitId_start
,如果要包含,可以使用:
$ git cherry-pick <commitId_start> ..<commitId_end>
代码冲突
当过程中遇到代码冲突,git cherry-pick
会停下来,让用户决定之后的操作。
--continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .
),第二步使用下面的命令,让 Cherry pick 过程继续执行。
$ git cherry-pick --continue
--abort
发生代码冲突后,放弃合并,回到操作前的样子。
--quit
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
git rebase
如果我们想要合并多次commit,让提交记录看起来很整洁,git rebase
是一个很好的选择,但是如果是多人协作开发的项目,一定要谨慎使用,很可能会导致提交记录的丢失。
$ git rebase -i [HEAD]
HEAD说明
- HEAD~0 表示当前版本
- HEAD~1 上一个版本
- HEAD~2 上上一个版本
- HEAD~3 上上上一个版本
- 以此类推…
也可以使用git log
命令查看commitId
,直接指定commitId
。