git init
git add *
git commit -m "aaa" (git commit) (git commit -v)
git status
git diff #see the difference between modified files and staged files (git diff --staged) #see the difference between staged files and commited files which is in the repository
我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式。来看一个实际的例子:
$ cat .gitignore
*.[oa]
*~
第一行告诉 Git 忽略所有以 .o
或 .a
结尾的文件。
我们再看一个 .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
给 git commit
加上 -a
选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
步骤
最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a
编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore
文件中补上,用 --cached
选项即可:
$ git rm --cached readme.txt
$ git rm log/*.log
注意到星号 *
之前的反斜杠 ,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜 杠。)。此命令删除所有
log/
目录下扩展名为 .log
的文件。类似的比如:
$ git rm *~
git log -p --word-diff
git log --stat
某些时候,单词层面的对比,比行层面的对比,更加容易观察。Git 提供了 --word-diff
选项。我们可以将其添加到 git log -p
命令的后面,从而获取单词层面上的对比。在程序代码中进行单词层面的对比常常是没什么用的。
不过当你需要在书籍、论文这种很大的文本文件上进行对比的时候,这个功能就显出用武之地了。另外,git log
还提供了许多摘要选项可以用,比如 --stat
,仅显示简要的增改行数统计。
git log --pretty=oneline
每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计。 还有个常用的 --pretty
选项,可以指定使用完全不同于默认格式的方式展示提交历史。比如用 oneline
将每个提交放在一行显示,
这在提交数很大时非常有用。另外还有 short
,full
和 fuller
可以用,展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。
git log --pretty=format:"%h - %an, %ar : %s"
但最有意思的是 format
,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
2.4 Git 基础 - 撤消操作
http://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C
git config --global alias.unstage 'reset HEAD --' #Git 命令别名
3.3 Git 分支 - 分支的管理
git branch
git branch -v
查看各个分支最后一个提交对象的信息
要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用 --merged
和 --no-merged
选项(Git 1.5.6 以上版本)。比如用 git branch --merged
查看哪些分支已被并入当前分支
git branch --merged
查看哪些分支已被并入当前分支
git branch --no-merged
查看尚未合并的工作
一般来说,列表中没有 *
的分支通常都可以用 git branch -d
来删掉。原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。
由于这些分支中还包含着尚未合并进来的工作成果,所以简单地用 git branch -d
删除该分支会提示错误,因为那样做会丢失数据。
不过,如果你确实想要删除该分支上的改动,可以用大写的删除选项 -D
强制执行,就像上面提示信息中给出的那样。
Git-分支-远程分支
http://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E8%BF%9C%E7%A8%8B%E5%88%86%E6%94%AF
推送本地分支
git push origin serverfix
若想把远程分支叫作 awesomebranch
,可以用 git push origin serverfix:awesomebranch
来推送数据。
git fetch origin
值得注意的是,在 fetch
操作下载好新的远程分支之后,你仍然无法在本地编辑该远程仓库中的分支。
换句话说,在本例中,你不会有一个新的 serverfix
分支,有的只是一个你无法移动的 origin/serverfix
指针。
如果要把该远程分支的内容合并到当前分支,可以运行 git merge origin/serverfix
。如果想要一份自己的 serverfix
来开发,可以在远程分支的基础上分化出一个新的分支来:
git checkout -b serverfix origin/serverfix
这会切换到新建的 serverfix
本地分支,其内容同远程分支 origin/serverfix
一致,这样你就可以在里面继续开发了。
跟踪远程分支
从远程分支 checkout
出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。
在跟踪分支里输入 git push
,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull
会获取所有远程索引,并把它们的数据都合并到本地分支中来。
git checkout -b serverfix origin/serverfix
git checkout --track origin/serverfix
git checkout -b sf origin/serverfix
可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]
git push origin :serverfix
Git-分支-分支的衍合
git checkout experiment
git rebase master
git rebase [主分支] [特性分支]
git rebase master server
git rebase --onto master server client
假设在接下来的一次软件发布中,我们决定先把客户端的修改并到主线中,而暂缓并入服务端软件的修改(因为还需要进一步测试)。
这个时候,我们就可以把基于 client
分支而非 server
分支的改变(即 C8 和 C9),跳过 server
直接放到 master
分支中重演一遍,但这需要用 git rebase
的 --onto
选项指定新的基底分支 master
4.1 服务器上的 Git - 协议
本地协议
git clone /opt/git/project.git #more efficient
git clone file:///opt/git/project.git
git remote add local_proj /opt/git/project.git
SSH 协议
git clone ssh://user@server/project.git
git clone user@server:project.git #或者不指明某个协议 — 这时 Git 会默认使用 SSH