时间:2018-04-13
作者:魏文应
说明
这个文档适合已经会使用git,但又经常遗忘一些指令的读者。也就是这是用来查表的。
-
git 版本:
-
操作系统:ubuntu 14.04LTS 32bit
一、常用指令列表
功能 | 命令 | 示例 | 示例说明 |
---|---|---|---|
初始化仓库 | git init | git init | 在当前目录下生产一个 .git 文件夹,这就是所谓该项目的本地仓库。 |
跟踪文件 | git add | git add *.c | 跟踪当前目录下的所有 .c 文件,也就是暂存,添加内容到下一次commit提交中。 |
提交保存 | git commit | git commit | 将跟踪的文件提交,保存到本地仓库。 |
提交保存 | git commit | git commit -m "笔记信息" | 加上 -m 参数,后面可以加上一些修改信息描述,以便以后查看笔记。 |
提交保存 | git commit | git commit -a -m "笔记信息" | 加上 -a 参数,把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。 |
检查文件状态 | git status | git status -s | 查看当前文件状态。可加参数 -s,显示的更紧凑一些。 |
查看暂存改动 | git diff | git diff | 查看已暂存和未暂存的修改,只显示尚未暂存的改动。 |
查看已暂存修改 | git diff --staged | git diff --staged | 显示已暂存的改动。 |
移除文件 | git rm | git rm main.c | 将某个文件从暂存区移除(工作目录下对应的文件也会被删除),下次提交就没有这个文件。 |
移除文件 | git rm | git rm --cached main.c | 将某个文件从暂存区移除(工作目录下保留对应的文件不被删除),下次提交就没有这个文件。 |
检出暂存区文件 | git checkout | git ckeckout -- readme.md | 将一个文件从暂存区检出,覆盖工作目录下相对应的一个文件。 |
检出已提交文件 | git checkout | git checkout 3115f6 readme.md | 将某个文件从已提交的某个版本中检出,覆盖工作目录和暂存区相对应的一个文件,其中 3115f6 是通过git log 命令查看到的某个版本ID(commit ID)。 |
撤销暂存 | git reset HEAD | git reset HEAD readme.md | 执行git add readme.md 命令之后,我想撤销这个暂存操作。 |
文件重命名 | git mv | git mv file_from file_to | 暂存区和工作区的这个文件都被重命名了。 |
--------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------- |
二、远程仓库操作
功能 | 命令 | 示例 | 示例说明 |
---|---|---|---|
克隆项目 | git clone | git clone https://github.com/libgit2/libgit2 | 这里将从github这个网站,下载一个项目的源代码 |
查看远程仓库 | git remote | git remote -v | 加上 -v 参数,会把远程仓库地址也显示出来 |
添加远程仓库 | git remote add | git remote add <shortname> <url> | shortname 是指定一个简称,url 是仓库的网络地址 |
删除远程仓库 | git remote rm | git remote rm wwy | 删除一个远程仓库 |
拉取信息 | git fetch | git fetch wwy | 从wwy代表的URL地址,拉取本地没有的信息 |
推送到远程仓库 | git push | git push wwy master | 将master分支推送到wwy上 |
远程仓库信息 | git remote show | git remote show [remote-name] | 查看具体某个远程仓库的详细信息 |
远程仓库重命名 | git remote rename | git remote rename old new | 将远程仓库重命名 |
三、分支操作命令
功能 | 命令 | 示例 | 示例说明 |
---|---|---|---|
创建分支 | git branch | git branch testing | 创建一个叫 testing 的分支 |
切换分支 | git checkout | git checkout testing | HEAD切换到testing分支上 |
合并分支 | git merge | git merge hotfix | 合并hotfix分支到当前分支上 |
删除分支 | git branch -d | git branch -d hotfix | 删除hotfix分支,强制删除使用-D参数 |
查看分支指向 | git log | git log --oneline --decorate | 查看当前分支指向的对象 |
查看分支列表 | git branch | git branch -v | 列出所有分支,-v 参数可以显示一下概要信息 |
远程分支列表 | git branch | git branch -a | 列出所有远程分支 |
变基操作 | git rebase | git rebase master | 将当前分支的基础分支设置为master |
中断一次合并 | git merge --abort | git merge --abort | 中断当前的一次合并(还没有合并成功的情况下) |
恢复到合并之前 | git reset | git reset --hard HEAD~ | 恢复到合并之前的状态(HEAD回合并前的位置) |
-
查看分支信息:
git log --oneline --decorate --graph --all
-
创建并切换分支:
git checkout -b testing
-
处理合并冲突:
git mergetool
然后提示用哪个工具,我这里安装了 vimdiff 。 -
查看哪些分支被合并到当前分支:
git branch --merged
-
查看哪些分支没有被合并到当前分支:
git branch --no-merged
-
在基于某个分支创建另一个分支:
git checkout -b serverfix origin/serverfix
,基于 origin/serverfix 分支创建一个 serverfix 分支,并切换到新创建的 serverfix 分支上。 -
变基操作步骤:
git checkout experiment git rebase master git checkout master git merge experiment # 或者:server 变基到 master上 git rebase master server # 变基原则: # 总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, # 从不对已推送至别处的提交执行变基操作,这样,你才能享受到两种方式带来的便利。
分支的合并做了哪些事呢?比如,将一个名为 Hotfix 分支合并到当前分支,一般有:
-
当前分支没有的文件,而hotfix分支有,则将这个文件添加到当前分支。
-
两个分支修改了相同文件,合并时会提示冲突,通过
git status
查看冲突情况。通过git mergetool
选择一款图形化工具,修改后commit提交即可。 -
当前分支和 hotfix分支合并一次以后,hotfix 再也没有修改过,这时当前分支和hotfix再做合并操作,无论当前分支做了什么,合并操作则没有任何效果。
-
将某个A分支合并到当前分支,合并的内容是A分支自上次合并后(如果和当前分支合并过)修改过的文件。
- 暂存工作(如果修改了文件,突然想切换到其它分支,但又不想执行commit提交,这时需要暂存当前工作):
功能 | 命令 | 示例 | 示例说明 |
---|---|---|---|
暂存工作 | git stash save | git stash save | 暂存当前工作目录,存储在栈中 |
暂存列表 | git stash list | git stash list | 查看一下暂存的存储列表 |
恢复某个暂存 | git stash apply | git stash apply | 也可以指定暂存:git stash apply stash@{2} ,其中stash@{2}通过查看分支列表获得 |
删除某个暂存 | git stash drop | git stash drop stash@{0} | 删除某个工作暂存 |
四、信息查看
功能 | 命令 | 示例 | 示例说明 |
---|---|---|---|
查看提交记录 | git log | git log | 列出所有提交信息 |
- git log 命令一些有用的参数:
参数 | 作用 |
---|---|
-p | 显示每次提交的内容差异 |
-2 | 只显示最近两次提交 |
--stat | 列出被修改过的文件 |
--pretty=oneline | 一行中显示 |
--graph | 通过ASCII 图形表示的分支合并历史 |
五、打标签
功能 | 命令 | 示例 | 示例说明 |
---|---|---|---|
创建轻量标签 | git tag | git tag v1.4 | 创建一个名为v1.4的标签,没有附加说明信息 |
创建附注标签 | git tag -a | git tag -a v1.4 -m 'my version 1.4' | -a 和 -m 参数添加了一些说明 |
后期打标签 | git tag -a | git tag -a v1.2 9fceb02 | 9fceb02 可以通过 git log --pretty=oneline 指令查看 |
查看标签 | git show | git show v1.4 | 查看某个标签的具体信息 |
列出所有标签 | git tag | git tag | 列出所有标签 |
列出相关标签 | git tag -l | git tag -l 'v2.*' | 列出以 v2. 开头的相关标签 |
检出标签 | git checkout -b | git checkout -b version2 v2.0.0 | 通过创建一个version2分支,将v2.0.0标签检出 |
共享标签 | git push | git push origin --tags | 将所有的tag标签推送到origin远程仓库 |
共享标签 | git push | git push origin v1.4 | 将v1.4这个tag标签推送到origin远程仓库 |
六、撤销操作
-
撤销暂存的文件:
git reset HEAD <file>
。有个文件在暂存区中,但你想从暂存区移除这个文件。 -
覆盖上一次提交:
git commit --amend
。在上一次提交以后,发现某个文件没有添加或者多添加了、提交简介写错,重新提交,覆盖上一次提交。注意:要在没有修改文件内容的前提下,上次提交以后紧接着执行才有效,比如:git commit -m 'initial commit' git add forgotten_file git commit --amend
-
撤销对工作区文件的修改:
git checkout -- <file>
。从暂存区检出覆盖工作区文件,达到撤销效果。 -
撤销对暂存区文件的修改:
git checkout <commit ID> <file>
。从已提交的文件中,覆盖暂存区和工作区的某个文件,达到撤销的效果。 -
撤销commit提交 :
git reset HEAD~
。如果你执行了commit提交命令,但你想撤销这一次commit提交操作。这里通过将HEAD指向提交前的快照来实现撤销效果(HEAD~ 是 HEAD 的父节点,从提交的角度来说,也就是本次提交前的快照)。注:这是下面的 “撤回到任意一次commit提交” 的特例。 -
撤回到任意一次commit提交:
git reset <commit ID>
如果你想撤回到该分支的某次commit上,将后面commit提交的内容舍弃(包括相关的提交历史)。可以通过移动HEAD来达到撤销效果。这里有几个参数:
git reset --soft <commit ID>
将HEAD指向目标点,不改变暂存区和工作目录。
git reset --mixed <commit ID>
移动HEAD,改变暂存区,工作目录不变(默认选项,效果和git reset <commit ID>
一样)。
git reset --hard <commit ID>
移动HEAD,改变暂存区,工作目录也改变。
上面说的改变,是指暂存区或者工作目录原来的文件会被删除,取而代之的是,用HEAD重新指向的快照填充覆盖。注:git reflog
命令可以显示我们放弃的commit,也就是reset操作之后,通过git log
看不到的那些快照。
七、添加忽略文件
-
忽略文件的名称为
.gitignore
。 -
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在 https://github.com/github/gitignore 找到它。
注意事项
-
git 命令中使用通配符 * 号: 比如,我们要log/ 目录下扩展名为 .log 的所有文件,按理来说,应该是:
git rm log/*.log
。但是,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。因此,如果我们想用通配符,要这么写:git rm log/\*.log
。
网友评论