Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
-
工作区(Working Directory)
就是你在电脑里能看到的目录
-
版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。
-
git init
在当前目录下创建一个空的git仓库
-
git add
添加一个文件到仓库
例如,此时目录下有一个hello.txt格式的文件,要添加这个文件到仓库,命令为git add hello.txt
如果目录下有多个文件,都要添加到仓库的话,命令为git add .
这个[.]点符号,就是代表全选的意思
-
git commit
将之前添加到仓库的文件提交到仓库
命令后面可以加参数-m 是对这次提交的注释,例如git commit -m "首次提交"
还有一种用法,就是不使用git add
添加文件到仓库,直接使用git commit -a -m "首次提交"
这个命令就是直接提交你改动过的文件到仓库
-
git cherry-pick
命令git cherry-pick [commit ID]
合并某个分支上的某个提交,操作对象是一个commit提交,首先查询到要合并commit提交的commit ID,然后执行前面的命令,如果没有代码冲突,合并到这里就结束了。如果有代码冲突,解决代码冲突,然后继续执行命令
git add .
git cherry-pick --continue
git push
解决冲突之后,git add .
把合并过来的修改添加到仓库中,然后git cherry-pick --continue
继续执行之前的合并操作,至此合并完成,就可以git push
提交到远程仓库了。
-
git status
查看仓库当前的状态。 命令git status
-
git diff
difference的所写,顾名思义,就是查看差异的,可以查看文件的改动内容。命令git diff
命令git diff HEAD -- hello.txt
可以查看工作区和版本库里面最新版本的区别
-
git reset
- 回退提交版本,用
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
,命令git reset [options] HEAD^
options参数有两个--soft
保留当前回退版本之后的工作区修改--hard
撤销当前回退版本之后的工作区修改(谨慎使用
)
最新的那个版本已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个commit id,于是就可以指定回到未来的某个版本:git reset --soft [commit id]
。
如果是误提交且已经推送到了远程,现在要回退到某个提交版本,误提交的版本不再需要了,完成的操作流程如下:
<1>.git log
查看提交记录,找到正确版本的commit id
<2>.git reset --soft [commit id]
回退版本, 使用--soft
保留修改比较稳妥
<3>.git push origin [分支名] --force
强制提交当前版本为最新版本
此时,暂存区内还保留着上次误提交的修改记录,如果修改或删除,再使用git reset HERD [filename]
撤销暂存,接下来就可以按需修改了。 - 如果已经
git add
提交到了暂存区,但是还没有git commit
提交到分支,就可以使用命令git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区,这样暂存区就是干净的了,工作区里有修改
命令git reset HEAD -- <filename>
- 现在,假设你不但改错了东西,还从暂存区提交到了版本库,怎么办呢?可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。
-
git log
显示从最近到最远的提交日志
如过信息输出太多不好看的话,可以加上--pretty=oneline
参数简化输出信息。
命令git log --pretty=oneline
命令git log --graph
可以看到分支合并图
命令git log -p
可以查看每次提交的更改内容
-
git reflog
如果在回退版本以后又想再次回到之前的版本,git reflog
可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log
则不能察看已经删除了的commit记录
-
git checkout
命令git checkout -- hello.txt
意思就是,把hello.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是hello.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是hello.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
git checkout sixah origin/sixah
创建本地分支sixah,映射远程分支origin/sixah
-
git rm
命令git rm
用于删除一个文件。假如你在工作区误删了一个文件,如果这个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
如果版本库中也不需要删除的那个文件的话,使用git rm
命令就可以删掉这个文件了
命令git rm -r --cache [directory]
删除远程仓库中已经提交的目录,执行完命令,记得commit
一次提交
-
git remote
命令git remote add origin <远程仓库地址>
关联远程仓库,这样就可以把本地仓库的文件同步到远程仓库
origin
是远程仓库的名字,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库
命令git remote -v
查看当前本地的Git仓库关联的远程仓库信息
命令git remote remove <远程仓库名>
删除关联的远程仓库
-
git push
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。命令git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push --set-upstream origin master
如果是第一次提交,需要设置提交和追踪的分支
-
git config credential.helper store
如果是http的远程仓库地址,也没有添加git密钥,每次提交都会让你输入你的git用户名和密码,当你输入过一次用户名和密码后,输入这个命令,git就会自动保存你的用户名和密码,下次再提交的时候,就不需要输入用户名和密码了
-
git clone
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。命令git clone <远程仓库地址>
然后就会在本地当前目录下,创建一个本地库
-
git branch
git branch
命令会列出所有分支,当前分支前面会标一个*
号
git branch <name>
创建分支
git checkout <name>
切换分支
git checkout -b <name>
创建+切换分支
git branch -d <name>
删除分支
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
-
git merge
git merge <name>
命令用于合并指定分支到当前分支。默认为fast forward
快速合并模式
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。命令git merge --no-ff -m "merge with no-ff" dev
请注意--no-ff
参数,表示禁用Fast forward
-
git stash
git stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash list
命令可以查看存储起来的工作现场
Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply
恢复,但是恢复后,stash
内容并不删除,你需要用git stash drop
来删除;
另一种方式是用git stash pop
,恢复的同时把stash
内容也删了:
比如模拟场景。修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
-
git pull
从远程抓取分支,使用git pull
-
git rebase
git rebase
操作可以把本地未push的分叉提交历史整理成直线
git rebase -i
修改提交历史信息,运行命令后,会进入交互式界面,如下所示
pick 5e187c7dbe8 add center style indent
pick 6d577eb3440 add center style
pick f9b9508a3ab add center style
pick 111ab9cc261 update templates
# Rebase 150a643..2fad1ae onto 150a643
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
如果我们需要合并历史的话,可以修改pick 为fixup,代表把当前提交信息合并到上一次的提交
pick 5e187c7dbe8 add center style indent
fixup 6d577eb3440 add center style
fixup f9b9508a3ab add center style
fixup 111ab9cc261 update templates
# Rebase 150a643..2fad1ae onto 150a643
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
这样就把最近的三次提交都合并到了第一次提交里面
-
git tag
命令git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id
命令git tag -a <tagname> -m "blablabla..."
可以指定标签信息
命令git tag
可以查看所有标签
命令git push origin <tagname>
可以推送一个本地标签;
命令git push origin --tags
可以推送全部未推送过的本地标签;
命令git tag -d <tagname>
可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>
可以删除一个远程标签。
-
配置别名
有没有经常敲错命令?比如git status
?status
这个单词真心不好记。
如果敲git st
就表示git status
那就简单多了,当然这种偷懒的办法我们是极力赞成的。
我们只需要敲一行命令,告诉Git,以后st
就表示status
:
$ git config --global alias.st status
好了,现在敲git st
看看效果。
当然还有别的命令可以简写,很多人都用co
表示checkout
,ci
表示commit
,br
表示branch
:
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
以后提交就可以简写成:
$ git ci -m "bala bala bala..."
--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用
-
参考文档
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000#0
网友评论