知道及接触Git也有一段时间了,但是很惭愧的只会5条左右的命令….(:捂脸),就是添加、提交、推送等,还有一些功能比如回退这是很常用的,这次搞个总结,以后忘记了来巴拉巴拉
准备工作
下载就不说了,然后是要配置Git,Git的全局配置一般会写到用户目录下的.gitconfig
文件中,所以之间修改这个文件也是可以的,当然用命令也是可以的,首先就是配置用户名和邮箱啦
1 | git config --global user.name "John Doe" |
加上global就是全局的意思,如果想单独设置可以去掉global,会保存在.git/config
下
修改差异比较工具:$ git config --global merge.tool vimdiff
查看配置:git config --list
基本操作
首先我们要得到一个仓库才行啊,有两种方式,1.本地创建一个 2.从别处克隆(下载)一个
1 | git init |
然后就可以操作这可库了,比如通过add跟踪一个文件,commit提交,status查看文件状态
1 | 查看文件状态 |
文件被跟踪后会进入暂存区,文件一单有改动使用status就可以看到基本变动信息,并且需要重新把这个变更的文件重新添加到暂存区,也就是说,你的改动并不会影响暂存区的文件,暂存区的文件相当于一份拷贝,你必须重新add后暂存区的文件才会更新成现在你最新更新的文件,所以说add方法是个多功能的命令
至于意义,因为当你commit提交的时候只会提交暂存区的文件,无论你本地修改了多少内容,只要不add,就是无效
Git还可以自动忽略某些文件,在仓库目录新建一个.gitignore
的文件,在这里面规定就可,可以使用通配符,比如
1 | 忽略所有以 .o 或 .a 结尾的文件。 |
文件 .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
,就是说这条命令有两个作用:
- 提交当前
暂存区
,并合并到上一次commit。常用于提交后发现漏了几个文件,又不想再提交一次的情况; - 可以修改上一次commit的描述。
如果我们不小心add了某个文件,怎么将这个文件从暂存区删除呢,可以使用git reset HEAD <file>...
,注意的是文件的修改并不会被抹掉,只是从暂存区删除
如果我们感觉某个文件完全没修改的必要,想要回退到未修改的状态,也就是与版本库一致,那么可以使用:$ git checkout -- benchmarks.rb
强制回退到某个版本,可以使用git reset --hard 02c4b5b31
后面的是ID,保证唯一即可,注意加了hard所有的修改会被抹掉,还有一些常用的:
1 | git reset HEAD^ #将当前分支往回退一步,不会抹掉修改,出现很多未暂存文件 |
你已经执行了 git push
, 把你的修改发送到了 GitHub,现在你意识到这些 commit 的其中一个是有问题的,你需要撤销那一个 commit ,这时可以使用 git revert <SHA>
:
git revert 会产生一个新的 commit,它和指定 SHA 对应的 commit 是相反的(或者说是反转的),也就是说这次反转也会被记录在 commit 历史里,这样更安全,但是由于一些原因不希望记录回退的记录那么可以……
还有一个大杀招:
1 | 取消当前版本之前的两次提交 |
远程仓库
在推送之前首先得和远程仓库建立联系,如果使用的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
你可能需要魔法上网~~