Git基本操作

知道及接触Git也有一段时间了,但是很惭愧的只会5条左右的命令….(:捂脸),就是添加、提交、推送等,还有一些功能比如回退这是很常用的,这次搞个总结,以后忘记了来巴拉巴拉

准备工作

下载就不说了,然后是要配置Git,Git的全局配置一般会写到用户目录下的.gitconfig文件中,所以之间修改这个文件也是可以的,当然用命令也是可以的,首先就是配置用户名和邮箱啦

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]

加上global就是全局的意思,如果想单独设置可以去掉global,会保存在.git/config
修改差异比较工具:$ git config --global merge.tool vimdiff
查看配置:git config --list

基本操作

首先我们要得到一个仓库才行啊,有两种方式,1.本地创建一个 2.从别处克隆(下载)一个

1
2
3
4
$ git init
# or
# 默认克隆到当前目录,也可以后面跟个指定的目录名
$ git clone git://github.com/schacon/grit.git

然后就可以操作这可库了,比如通过add跟踪一个文件,commit提交,status查看文件状态

1
2
3
4
# 查看文件状态
$ git status
# 开始跟踪一个新文件
$ git add README

文件被跟踪后会进入暂存区,文件一单有改动使用status就可以看到基本变动信息,并且需要重新把这个变更的文件重新添加到暂存区,也就是说,你的改动并不会影响暂存区的文件,暂存区的文件相当于一份拷贝,你必须重新add后暂存区的文件才会更新成现在你最新更新的文件,所以说add方法是个多功能的命令
至于意义,因为当你commit提交的时候只会提交暂存区的文件,无论你本地修改了多少内容,只要不add,就是无效

Git还可以自动忽略某些文件,在仓库目录新建一个.gitignore的文件,在这里面规定就可,可以使用通配符,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 忽略所有以 .o 或 .a 结尾的文件。
*.[oa]
# 忽略所有以~结尾的文件
*~
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

文件 .gitignore 的格式规范如下:

  • 所有空行或者以注释符号 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff --cached 或者git diff --staged命令

好了,最后就是提交了,一般使用类似$ git commit -m "Story 182: Fix benchmarks for speed"的命令,后面跟提交说明
如果给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

撤销操作

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用 --amend 选项重新提交:$ git commit --amend,就是说这条命令有两个作用:

  1. 提交当前暂存区,并合并到上一次commit。常用于提交后发现漏了几个文件,又不想再提交一次的情况;
  2. 可以修改上一次commit的描述。

如果我们不小心add了某个文件,怎么将这个文件从暂存区删除呢,可以使用git reset HEAD <file>...,注意的是文件的修改并不会被抹掉,只是从暂存区删除
如果我们感觉某个文件完全没修改的必要,想要回退到未修改的状态,也就是与版本库一致,那么可以使用:$ git checkout -- benchmarks.rb
强制回退到某个版本,可以使用git reset --hard 02c4b5b31后面的是ID,保证唯一即可,注意加了hard所有的修改会被抹掉,还有一些常用的:

1
2
3
4
5
$ git reset HEAD^ #将当前分支往回退一步,不会抹掉修改,出现很多未暂存文件

HEAD^ # HEAD之前的commit
HEAD^^ # HEAD回退两步的commit
master~5 # master指针回退5步的commit

你已经执行了 git push, 把你的修改发送到了 GitHub,现在你意识到这些 commit 的其中一个是有问题的,你需要撤销那一个 commit ,这时可以使用 git revert <SHA> :
git revert 会产生一个新的 commit,它和指定 SHA 对应的 commit 是相反的(或者说是反转的),也就是说这次反转也会被记录在 commit 历史里,这样更安全,但是由于一些原因不希望记录回退的记录那么可以……
还有一个大杀招:

1
2
3
4
# 取消当前版本之前的两次提交
git reset --hard HEAD~2
# 强制提交到远程版本库,从而删除之前的两次提交数据
git push origin HEAD --force

远程仓库

在推送之前首先得和远程仓库建立联系,如果使用的clone命令创建的仓库,那么就会自动关联了,如果是init创建的,就需要手动的关联:
git remote add origin <server>
然后就可以使用git push origin master推送了,master可以换成你想要推送的任何分支
当然也可以添加多个远程仓库,名字不用重即可,比如上面那个就是叫origin的,通过克隆的会自动归于origin下
删除远程库:$ git remote rm paul
查看所关联的仓库:$ git remote -v
获取远程仓库的最新内容可以使用:git pull,他会拉取并自动合并
只是拉取的话也可以使用:git fetch origin

分支/标签管理

查看本地所有分支(如果至查看远程就加 -r ,查看全部 -a):
git branch
创建一个叫做“feature_x”的分支,并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的
git push origin <branch>
要合并其他分支到你的当前分支(例如 master),执行:
git merge <branch>
删除远程分支:
git push origin --delete [branch-name]


查看所有 tag:
git tag
删除本地分支:
git tag -d [tag]
删除远程分支:
git push origin :refs/tags/[tagName]
查看 tag 信息:
git show [tag]
提交指定/全部 tag:
git push [remote] [tag]
git push [remote] --tags
新建一个分支,指向某个 tag:
git checkout -b [branch] [tag]
可以执行如下命令创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。当然不一定是10位,只要保证唯一性就可以,可以使用log命令获得,默认是当前最近的一次 commit

其他

Git默认是忽略文件夹的大小写的,如果想要它对大小写敏感使用:
git config core.ignorecase false
在需要的仓库下执行即可,如果想全局生效加--global参数

待补充…

评论框加载失败,无法访问 Disqus

你可能需要魔法上网~~