文件名称:git from bottom up
文件大小:792KB
文件格式:PDF
更新时间:2014-10-03 06:08:35
git svn
GIT git tree对象对应于磁盘上的目录,每个commit指向一个完整的tree,包含所有文件,相当于快照,其中的blob可能是diff,也可能是完整的file。 diff的index 78ba164..bb23a39,后一个是该对象的id,不知道前一个的选取标准是什么。 blob hash,不同目录下相同文件hash一样,共享一个对象。 branch实际上就是一个commit,和tags一样,只不过tags固定不变,而branch总是指向分支上最新的commit。 不同的branch位于同一个工作目录,checkout的时候先恢复工作分支A到一定状态(保存修改),然后计算于要切换到的分支B的diff,应用之,就得到B了。 git log --grep='foo' --author='johnw' --since="1 month ago" master.. HEAD^ HEAD~ git diff HEAD^1:Makefile HEAD^2:Makefile git checkout A 切换到A git merge B 合并分支B,生成一个新commit B',父节点为A和B。合并别人的工作成果? $ git checkout Z $ git rebase D 将分支Z重定向到最新的D上,总是生成针对最新代码的patch。用于给主流开发分支upstream提供或者维护patch时很有用。rebase的交互模式-i,pick和squash压缩commit。 git add --patch foo.c 可以让你选择提交一个文件的部分修改 git stage -i 交互模式 stacked git: stg, quilt like git git reset --soft HEAD^ 丢弃最后一个commit,HEAD指向其父节点,本地修改不变。错误提交的时候比较有用。 git reset foo.c 相当于unstage foo.c git reset --hard 会丢弃所有本地更改,恢复到某一版本,危险!应该使用下面的命令,先保存本地修改,然后在一个新的分支上恢复到需要的版本。 $ git stash $ git checkout -b new-branch HEAD~3 # head back in time! 一切正常的话,重命名分支即可 $ git branch -D master # goodbye old master (still in reflog) $ git branch -m new-branch master # the new-branch is now my master 在git reset --hard 之前一定不要忘记运行git stash git reflog 查看所有记录 git stash, apply git pull git push git checkout