Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等。顾名思义,版本控制系统主要就是控制、协调各个版本的文档内容的一致性,这些文档包括但不限于代码文件、图片文件等等。早期SVN占据了绝大部分市场,而后来随着Git的出现,越来越多的人选择将它作为版本控制工具,社区也越来越强大。相较于SVN,最核心的区别是Git是分布式的VCS,简而言之,每一个你pull下来的Git仓库都是主仓库的一个分布式版本,仓库的内容完全一样,而SVN则不然,它需要一个中央版本库来进行集中控制。采用分布式模式的好处便是你不再依赖于网络,当有更改需要提交的时候而你又无法连接网络时,你只需要把更改提交到本地的Git仓库,最后有网络的时候再把本地仓库和远程的主仓库进行同步即可。当然,分布式和非分布式各有各的优缺点,但是目前来看,分布式的Git正逐渐被越来越多的人所接受并推广。
以下是Git的一些常用命令及含义:
git init
:在本地新建一个repo仓库,进入一个项目目录,执行git init,会初始化一个repo仓库,其中会新建一个名为.git的文件夹。git clone [url]
:获取一个url对应的远程git repo,创建一个local copy。clone下来的repo会以url最后一个斜线后面的名称命名,创建一个文件夹,如果想要指定特定的名称,可以用 git clone [url] [repo-name] 这样的命令。git status
:查询repo的状态。git status -s 其中的 -s 表示short,-s的输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言。git add
:添加暂存区的新文件或改动!git add .
会递归地添加当前工作目录中的所有文件。
git log
:显示一个分支的提交历史。git log --oneline --number
:每条log只显示一行,显示number条。git log --oneline --graph
: 可以图形化地表示出分支合并历史。git log branchname
: 可以显示特定分支的log。git log --oneline branch1 ^branch2
:可以查看在分支1,却不在分支2中提交。^表示排除这个分支(window下可能要给^branch2加上引号)。git log --decorate
: 会显示出tag信息。git log --author=[author name]
: 可以指定作者的提交历史。git log --since --before --until --after
:根据提交时间筛选log。git log --no-merges
:可以将merge的commits排除在外。git log --grep
: 根据commit信息过滤log(git log –grep=keywords)默认情况下,git log –grep –author 是OR的关系,即满足一条即被返回,如果你想让它们是and的关系,可以加上 –all-match 的option。git log -S"[string]"
: 引进diff来过滤,比如: git log -S”title”(注意S和后面的词之间没有等号分隔)。git log -p
: 在每次提交时显示引进的补丁。每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch显示出来。另一种方法是git show [SHA] 。git log stat
: 在每次提交时显示引入的更改的差异。同样是用来看改动的相对信息的,–stat比-p的输出更简单一些。
git diff
:比较工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。git diff cache
:查看已经暂存起来的文件和上次提交时的快照之间的差异。git diff HEAD
:显示所有暂存的或者存储的修改,即比较working directory和上次提交之间所有的改动。git diff [version tag]
:查看自从某个版本之后都改动了什么,也可以加上 –stat 参数来简化输出。
git commit
:提交已经被add进来的改动。git commit -m "[commit message]"
:添加提交信息。git commit -a
: 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存)。对于没有track的文件,还是需要git add一下。git commit --amend
: 增补提交。会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消。
git reset
:取消改动和提交。git reset HEAD --filename
: 这里的HEAD关键字指的是当前分支最末梢最新的一个提交。也就是版本库中该分支上的最新版本。这个命令用来把不小心add进去的文件从缓存状态取出来,可以单独针对某一个文件操作 ,这个–filename中的–也可以不加。git reset --soft
: 移动HEAD到特定的提交引用,索引和缓存的不会改变。git reset --hard
: 取消缓存文件并且取消工作目录上自从上次提交的任何更改。git reset --hard HEAD
: 上次提交之后,所有缓存的改动和工作目录的改动都会消失,还原到上次提交的状态。这里的HEAD可以被写成任何一次提交的SHA-1 。不带soft和hard参数的 git reset,实际上带的是默认参数的mixed。
git revert HEAD
:反转撤销提交,会创建一个反向的新提交。可以使用git revert HEAD -n
来告诉Git先不要提交。git rm file
:从staging区移除文件,同时也移除出工作目录。git rm --cached
:从staging区移除文件,同时也移除出工作目录。从功能上等同于 git reset HEAD,清除了缓存区,但不动工作目录树。
git clean
:是从工作目录中移除没有track的文件。通常的参数是 git clean -df,其中 -d 表示同时移除目录, -f表示force,因为在git的配置文件中,clean.requireForce=true,如果不加-f,clean将会拒绝执行。git mv [file_from] [file_to]
:重命名文件,目录或符号链接。git stash
:能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。git stash list
:要查看现有的储藏。git stash apply
:将堆栈中的内容应用到当前目录,堆栈中的内容并没有删除。可以使用git stash apply stash@{[name]}
(如stash@{1})指定恢复哪个stash到当前的工作目录。git stash pop
:将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。git stash drop stash@{[name]}
:从堆栈中移除某个指定的stash。git stash clear
:清除堆栈中的所有内容。
git branch
:列出本地已经存在的分支,并且在当前分支的前面用”*”标记。git branch -r
:查看远程版本库分支列表。git branch -a
:查看所有分支列表,包括本地和远程。git branch [name]
:创建名为name的分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支。git branch -d [name]
:删除name分支,如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用git branch -D name
:强制删除name分支。git branch -m [oldName] [newName]
:给分支重命名。git branch -vv
:可以查看本地分支对应的远程分支。
git checkout [branchname]
:切换分支。git checkout -b [branchname]
:如果分支存在则只切换分支,若不存在则创建并切换到[branchname]分支。git checkout filename
:放弃单个文件的修改。git checkout .
:放弃当前目录下的修改。
git merge [branch]
:将来自命名提交的更改(自其历史记录与当前分支分开时)合并到当前分支中。git merge --no-ff -m '[message]'
:可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。可以为你的合并添加注释信息。git merge --abort
:将中止合并过程并尝试重建合并前状态。但是,如果在合并开始时有未提交的更改(特别是如果在合并开始后进一步修改了这些更改),git merge –abort在某些情况下将无法重建原始(合并前)更改。git merge --continue
:解决完合并冲突并提交暂存后,生成新的提交的log信息。
git tag
:列出现有标签。git tag -a [version] -m '[message]'
:创建一个含附注类型的标签。git push origin [tagname]
:将标签推送到远端,如果要一次推送所有本地新增的标签上去,可以使用--tags
选项。
git remote
:列出远程仓库别名。如果你克隆一个项目,Git会自动将原来的url添加进来,别名就叫origin。使用-v
选项可以看见每一个别名对应的实际url。git remote add [alias] [url]
:添加一个新的远端仓库,[alias]一般为origin,你可以设置为其他的别名。git remote remove [name]
:删除名为[name]的远程。将删除远程的所有远程跟踪分支和配置设置。git remote set-url origin [url]
:修改关联的远程仓库地址。git remote update origin --prune
:更新远程的分支列表到本地。
git fetch [alias] [branch]
:从远程获取最新版本到本地。如果未指定远程,则默认情况下将使用origin远程,除非为当前分支配置了上游分支。git pull [alias] [branch]
:是从远程仓库fetch,并尝试合并到当前的分支。git pull会首先执行git fetch,然后执行git merge,把取来的分支的head合并到当前分支。这个合并操作会产生一个新的提交。如果使用–rebase参数,它会执行git rebase来取代原来的git merge。git push [alias] [branch]
:把当前分支合并到[alias]上的 [branch]分支。如果分支已经存在,将会更新,如果不存在,将会添加这个分支。