git 随想

1 所有内容都在本地
  便宜快速的本地分支
  因为是本地的所以是分散的
2 git 很省空间
  git 很快
3 缓冲区功能
4 github


git flow


一些版本控制系统把工作目录称为工作拷贝。git新手经常会混淆git中的版本库和工作目录树。因为在subversion等传统的版本控制工具中,工作目录在本地,版本库在服务器上,而git中并非如此

在git中,版本库不在服务器上,而存储在本地工作目录的".git"目录中。这意味着,要想知道历史信息,只和本地的版本库打交道即可,无须与服务器上的版本库通信

具体来说,把远程版本库里的改动拿到本地版本库中,需要两部操作。第一步,把改动取来(Fetch),把远程版本库中的版本和分支复制到本地的远程版本库中。第二步,在本地,把本地的远程版本库里取来的改动与自己本地的改动合并。git工具包提供了这样的合并工具。一般来说,取来操作和合并操作总是先后执行。因此,在git中可以用一个命令来完成这两部操作:拖入(Pull)。

git help command

windows下的git

Cygwin

MSys版的git
可能与*nix版不兼容


Git需要用户提供若干信息。通过命令git config,用户可以把此类信息提供给本地版本库


用户名和邮箱是必须的

git config --global user.name ""
git config --global user.email ""

git 可设置的值超过130个。其中大多数都很少用到。但有一个例外:关于用不同颜色显示git命令输出

若想在命令行窗口使用不同的颜色显示不同类型的内容,请将"color.ui"的值设为auto或always

.git/config


git图形界面

gitk
添加 --all 参数,可以显示全部分支的历史


git中有三个地方可以存放代码。第一个地方是工作目录树
第二个是索引,也就是暂存区。暂存区是工作目录树和版本库的缓冲区。存放着准备提交到版本库中的修改

第三个也就是最后一个,是版本库


使用命令git commit时,可以接受多个 -m 参数


精心写出完美的提交留言是一种艺术。这可以通过查看其他成功项目的提交日志来学习。
在每一个提交上花费一两分钟,总结这些修改,就像给坐在旁边的开发人员解释一样。首先用一句简单的话来概括此提交;然后用几句话全面解释

对于比较复杂的提交留言,需要用编辑器来输入。为启动编辑器,git会按照以下顺序查找编辑器的设置:

  1 环境变量 GIT_EDITOR
  2 git的设置 core.editor
  3 环境变量 VISUAL
  4 环境变量 EDITOR
  5 vi

git log --pretty=oneline

git archive --format=tar \
            --prefix=mysite-1.0/ 1.0 \
            | gzip > mysite-1.0.tar.gz

git add -i
git add -p
git add .

也即是说,当在工作目录树中修改了一个文件后,可以先暂存此修改,之后再次修改该文件,然后可以提交刚才已经暂存的修改,而再次修改的内容没有提交,仍然在工作树中


git不会单独记录和追踪目录。有一个解决方案:在想要跟踪的目录里添加一个空文件,文件名通常是"."开头

另一种提交方式是:给git commit传递 -a参数,git会把工作目录树中所有的改动提交到版本库中,否则,只有已纳入git版本控制的文件的修改被提交

git commit -m "cool" some-file

-C 告诉git复用指定提交的提交留言,而不是从头再写一个


git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch


git diff 工作目录树 暂存区
git diff --cached 暂存去 版本库
git diff HEAD 工作目录树 版本库

git mv 来重命名


.gitignore   .git/info/exclude /usr/share/git-core/templates/info/exclude

问自己一个简单的问题:每个人的版本库中都需要这类忽略吗?所以把个人偏好的作为版本库的一部分发布出去并不是一个好想法


git checkout -b

直接合并
压缩合并 git merge --squash
拣选合并 git cherry-pick 321d76f
  要拣选多个提交,传递参数 -n

不一定使用 -m参数。编辑器会使用刚刚拣选的提交的提交留言(在解决合并冲突时也如此)

git branch -d -D -m -M
git stash


git log -10

git log 7b1558c
注意,上面的例子使用的是提交名称缩写,不论输入几位,git都会设法匹配

git log 11111.22222
git log 111..

^^
~1

git diff 指定版本范围与git log一样
git diff --stat


当推入变更之后又去修改历史,并且随后又推入不同的变更,则会给那些已经拿到了之前的变更的同事带来很大麻烦

git revert 此命令通过在版本库中创建一个反向的新提交来抵消原有的提交
-n
--no-edit


复位

  git reset

重写历史
  重新排序提交
  多个提交压和成一个提交
  将一个提交分解为多个提交

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
你可以观察到 Git 重写目录树并且提交,然后将分支指针移到末尾。一个比较好的办法是在一个测试分支上做这些然后在你确定产物真的是你所要的之后,再 hard-reset 你的主分支。要在你所有的分支上运行filter-branch的话,你可以传递一个--all给命令。


git tag
git push --tags

通过git子模块来跟踪外部版本库

git stash
临时将代码存档


悬空对象

git gc
    --aggressive


git fsck
git reflog

git branch -D 删除一个实验分支时,git会暂时保留该分支的内容

如果你决定恢复那部分历史,你可以创建一个新的引用指向它,例如创建一个新的分支

gc.reflogExpireUnreachable
gc.reflogExpire

当我们在执行git gc命令时,它会调用git prune命令把这些悬空对象(dangling objects)清除掉(prune);一般默认是清除超过二周的悬空对象。如果我们不要等二周时间,可在git 中设置一个环境变量gc.pruneExpire;也可在执行命令时设置清除(prune)的时间长度(expire date)。

撤底删除指令

git reflog expire --expire-unreachable=0 --all
git gc --prune=0


http://liuhui998.com/
http://progit.org/book/zh/
git 中文手册


git svn
http://www.robinlu.com/blog/archives/194

git flow
http://ihower.tw/blog/page/2
http://agilejava.blogbus.com/logs/103552611.html

猜你喜欢

转载自easylife.iteye.com/blog/972952