Git 使用笔记

学习使用Git工具时作的一些笔记, 方便查看.

(主要参考: Pro Git 简体中文版)

1. git rm

最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。


2. git rm --cached

把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中(当切换到别的分支或历史再切换回来时, 这些文件都会丢失)。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可.


3. git mv

重命名文件并将文件加入到暂存区.  其实,运行 git mv 就相当于运行了下面三条命令:

$ mv README.txt README
$ git rm README.txt
$ git add README

4. glob 模式

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号( *)匹配零个或多个任意字符; [abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号( ?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如  [0-9] 表示匹配所有 0 到 9 的数字)。

$ git rm log/\*.log
注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。

5. git log 

可以接很多参数

-p [-num] 参数显示相邻两次提交的 diff, 加上 -num 参数则只显示最近 num 次提交的 diff.

-stat 仅显示简要的增改行数统计

git reflog : 查看引用记录

6. .gitignore

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

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

我们再看一个 .gitignore 文件的例子:

# 此为注释 – 将被 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

**/ pattern is available in Git since version 1.8


7. git diff

首先要看懂 git diff 的格式, 可以参考 读懂diff 这篇博客, 另外 stack overflow上有一个详尽的实例  How to work with diff representation in git.

git diff 不接参数显示未暂存区和暂存区的 diff
--staged 参数显示暂存区和上一次提交之间的 diff

8. gitk 图形化界面

用 gitk 在linux 下看提交历史和比较各个历史版本的diff非常方便. 而且能够很清楚的看到分支 merge 图.

9. git commit --amend

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行  --amend 提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

10. git remote

-v : 列出所有的远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行  git remote add [shortname] [url]
$ git remote
origin
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin	git://github.com/schacon/ticgit.git
pb	git://github.com/paulboone/ticgit.git

现在可以用字符串 pb 指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行 git fetch pb

$ git fetch pb
remote: Counting objects: 58, done.
remote: Compressing objects: 100% (41/41), done.
remote: Total 44 (delta 24), reused 1 (delta 0)
Unpacking objects: 100% (44/44), done.
From git://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

现在,Paul 的主干分支(master)已经完全可以在本地访问了,对应的名字是pb/master,你可以将它合并到自己的某个分支,或者切换到这个分支,看看有些什么有趣的更新。

我们可以通过命令  git remote show [remote-name] 查看某个远程仓库的详细信息.

在新版 Git 中可以用 git remote rename 命令修改某个远程仓库在本地的简称,比如想把 pb改成 paul,可以这么运行:

$ git remote rename pb paul
$ git remote
origin
paul

注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的 pb/master 分支现在成了 paul/master

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行 git remote rm 命令:

$ git remote rm paul
$ git remote
origin


11. git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支.

如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以, git fetch origin会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住, fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。


12. git tag

git tag 查看所有标签

git tag tagname  创建轻量级标签, 不包含附注信息

git tag -a tagname -m 'annotate' 创建附注标签, 包含附注信息

git show tagname 查看标签信息, 并连同打标签时的提交对象信息


后期加注标签:

git tag -a tagname 9fceb02

分享标签:

默认情况下, git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行  git push origin [tagname] .
如果要一次推送所有本地新增的标签上去,可以使用  --tags 选项. git push origin --tags


13. git 命令自动补全

如果你用的是 Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入contrib/completion 目录,会看到一个 git-completion.bash 文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash),并把下面一行内容添加到你的 .bashrc 文件中:

source ~/.git-completion.bash

也可以为系统上所有用户都设置默认使用此脚本。Mac 上将此脚本复制到/opt/local/etc/bash_completion.d 目录中,Linux 上则复制到 /etc/bash_completion.d/ 目录中。这两处目录中的脚本,都会在 Bash 启动时自动加载。


14. Git 命令别名

可以用  git config 为命令设置别名。来看看下面的例子:

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.unstage 'reset HEAD --'
$ git config --global alias.last 'log -1 HEAD'
外部命令:

$ git config --global alias.visual '!gitk'
git visual 将启动 gitk


15. git 分支的创建与合并

git branch new_branch 创建新分支 new_branch, 但不切换,分支, 任停留在原分支上

git checkout -b new_branch  同上, 但同时切换到新分支上

git branch -d old_branch 删除 old_branch 分支, 但不能删除未合并分支

git branch -D old_branch 可以删除未合并分支, 可能造成丢失数据

git merge some_branch 合并当前分支和some_branch分支, 若有冲突则需要手工修改冲突文件, 并重新提交

git branch -v 查看所有分支信息

git branch -a 查看包括远程分支在内的所有分支信息

git branch --merged 查看哪些分支已并入当前分支

git branch --no-merged 查看哪些分支未并入当前分支


16. 远程分支

用  (远程仓库名)/(分支名) 这样的形式表示远程分支。比如我们想看看上次同  origin 仓库通讯时  master 分支的样子,就应该查看  origin/master 分支。

git fetch origin 同步远程服务器上的数据到本地。这样本地origin下的分支会与服务器上保持一致. 即 origin/master与服务器一致, 但本地的master分支并没有改变, 可以执行merge来获得服务器的更新.


推送本地分支:

如果你有个叫  serverfix 的分支需要和他人一起开发,可以运行  git push (远程仓库名) (分支名)
$ git push origin serverfix
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.74 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new branch]      serverfix -> serverfix

也可以运行  git push origin serverfix:serverfix 来实现相同的效果,它的意思是“上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为 serverfix 分支”。通过此语法,你可以把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作 awesomebranch,可以用  git push origin serverfix:awesomebranch 来推送数据。

值得注意的是,在 fetch 操作下载好新的远程分支之后,你仍然无法在本地编辑该远程仓库中的分支。换句话说,在本例中,你不会有一个新的 serverfix 分支,有的只是一个你无法移动的 origin/serverfix 指针。

如果要把该远程分支的内容合并到当前分支,可以运行 git merge origin/serverfix。如果想要一份自己的 serverfix 来开发,可以在远程分支的基础上分化出一个新的分支来:

$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

这会切换到新建的 serverfix 本地分支,其内容同远程分支 origin/serverfix 一致,这样你就可以在里面继续开发了。


跟踪远程分支:

从远程分支 checkout 出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。

在克隆仓库时,Git 通常会自动创建一个名为 master 的分支来跟踪 origin/master。这正是git push 和 git pull 一开始就能正常工作的原因。当然,你可以随心所欲地设定为其它跟踪分支,比如 origin 上除了 master 之外的其它分支。刚才我们已经看到了这样的一个例子:git checkout -b [分支名] [远程名]/[分支名]。如果你有 1.6.2 以上版本的 Git,还可以用 --track 选项简化:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'

删除远程分支:

可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]。如果想在服务器上删除 serverfix 分支,运行下面的命令:

$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
 - [deleted]         serverfix
有种方便记忆这条命令的方法:记住我们不久前见过的  git push [远程名] [本地分支]:[远程分支]  语法,如果省略  [本地分支],那就等于是在说“在这里提取空白然后把它变成 [远程分支]”。



16. 分支的衍合(rebase)

类似于merge, 但会产生更加干净的提交历史, rebase的解释比较复杂, 请参看  分支的衍合 这一章.


17. 查看分支之间的提交差别


双点语法:

git master..experiment : 所有可从experiment分支中获得而不能从master分支中获得的提交

git log origin/master..HEAD: 显示任何在你当前分支上而不在远程 origin 上的提交

多点:

git log refA refB --not refC : 查找所有从 refArefB包含的但是不被 refC包含的提交

git log refA refB ^refC

三点:

git log master...experiment:  这个可以指定被两个引用中的一个包含但又不被两者同时包含的分支

git log --left-right master...experiment : 显示每个提交分别属于哪个分支
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值