分享

git questions

 RK34 2015-06-22

SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是Mn版本控制系统工具。支持创建、克隆、提交、push、pull 和合并等操作。


git图像化界面:gitk


1.交互式暂存
git add -i(--interactive)

2.提交范围
双点:2个分支的差异。比较某个分支到另一个分支差异。
git log origin/master..HEAD

三点:不是2者共有的引用。

3.重整log
git commit --amend

git rebase -i(!!!每一次提交都会被重写,无论是否修改。所以不要覆盖已推送的提交——这样做会使其他开发者产生混乱,因为你提供了同样变更的不同版本)
git commit --amend
git rebase --continue

压制(Squashing)提交

4.patch
1.git apply
git apply比patch -p1更为严格,且不会出现混乱。
git diff格式描述的补丁:还会相应地增加,删除,重命名文件。普通patch命令不会这么做。
git apply是事务性操作命令。要么所有补丁都打上去,要么全部放弃。不会出现patch那样。
仅仅是更新文件,所以此命令不会自动生成提交。
git apply --stat
git apply --check
如果有问题,返回非零状态,shell脚本可用于检测状态。

--directory=指定目录

2.git am mbox格式的文件
From 加空格和信息
git format-patch还包含作者信息和提交信息。
-M 祖先
-s 某次提交之后
-1 单次
-s --root origin 从origin到指定提交
传统diff命令生成的补丁,只能用git apply处理。

自动创建提交对象
git am --resolved提交修正结果
-3选项进行三方合并。对于打过的补丁再打一遍,自然产生冲突,可以加上-3选项。
-i交互模式。

5.存储
多个分支之间切换
git stash list
git stash apply stash@x
git stash drop stash@x

git stash branch xxx


1.什么是衍合?
merge:3方合并,形成一次提交。把最终结果合并。
衍合:把一个分支的提交改变在另一个分支重放一遍。
原理:回到2个分支的共同祖先,提取所在分支每次提交的差异,差异保存到临时文件,然后从当前分支切换到需要衍合入的分支,依次施用每一个差异补丁文件。

然后可以回到需要衍合分支,进行一次快进合并

衍合产生一个更为简洁的提交历史。仿佛所有修改都是先后进行的,尽管实际上他们原来是同时发生的。
衍合到远程主线分支。

--onto

衍合的风险

2.git revert和git reset
git revert 是撤销某次操作,此次操作之前的commit都会被保留
git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区

3.推送某次提交到远程



Git最初作为Linux的版本控制工具,提供了透明、完整、稳定的Patch功能。
一是用git diff生成的标准patch,二是git format-patch生成的Git专用Patch。

diff 和format-patch的比较:

  • 兼容性:很明显,git diff生成的Patch兼容性强。如果你在修改的代码的官方版本库不是Git管理的版本库,那么你必须使用git diff生成的patch才能让你的代码被项目的维护人接受。

  • 除错功能:对于git diff生成的patch,你可以用git apply --check 查看补丁是否能够干净顺利地应用到当前分支中;如果git format-patch 生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作,你也可以使用git am -3进行三方合并,详细的做法可以参考git手册或者《Progit》。从这一点上看,两者除错功能都很强。

  • 版本库信息:由于git format-patch生成的补丁中含有这个补丁开发者的名字,因此在应用补丁时,这个名字会被记录进版本库,显然,这样做是恰当的。因此,目前使用Git的开源社区往往建议大家使用format-patch生成补丁。

1.一次提交生成patch
git format-patch -1 commit 

2.多次提交生成patch
git format-patch -n commit 
n为几次提交

3.某次提交之后所有的修改生成patch
git format-patch -s


三个区域/三类对象

理解git里的三个区域概念非常重要。git里很多常用的命令都是围绕着这三个区域来做的。它们分别为:

  • working directory,也就是你所操作的那些文件

  • history,你所提交的所有记录,文件历史内容等等。git是个分布式版本管理系统,在你本地有项目的所有历史提交记录;文件历史记录;提交日志等等。

  • stage(index),暂存区域,本质上是个文件,也就是.git/index

git中还有三类常用对象(实际不止三种),理解这三类对象也很重要。分别为:

  • blob,用于表示一个文件

  • tree,用于表示一个目录,索引到若干文件或子目录

  • commit,用于表示一次提交(commit)

暂存区文件:
git ls-files --stage

1.git当前分支合并远程分支

git-blame - Show what revision and author last modified each line of a file

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多