git note

Useful reference:

Git basic

In working directory

git status 各文件处于什么状态

git add <file>... add file to staged area, 同时未曾跟踪过的文件标记为跟踪

git diff 查看工作目录和 index 之间的差别

In index

git commit -m "MESG" 提交至本地 repository

git checkout <file..> or <dir..> 更新工作目录中的指定文件

git diff --staged 查看 index 和 最新提交的区别

In local repository

git push <remote> <branch> 将本地仓库推送至远程仓库

git reset --hard <sha1> 回滚到某个提交

git log 查看历史提交记录

git checkout <branch> 切换到指定分支

In remote repository

git clone <url> 将远程仓库克隆至本地

git pull <remote> 获取远程仓库文件并合并到当前分支

git fetch <remote> 从远程仓库抓取数据到本地版本库

git push <remote> :<branch> 删除远端仓库指定分支

Git advanced

about git rebase

其原理是回到两个分支最近的共同祖先,根据当前分支(即将要rebase的分支)后续的历次提交对象生成一系列文件补丁, 然后以基底最后一个提交对象为新的出发点,逐个应用之前准备好的补丁文件,生成新的提交对象。 不要对已经发布的提交的分支进行rebase,它丢掉了一些提交对象,又创造了一些类似但不同的提交,其他合作者不得不重新合并他们, 会导致提交历史变得很糟糕

$ git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
           [<upstream>] [<branch>]
$ git checkout master
$ git merge branch

Commands available while rebasing:

References:

Git workflow

Git snippet

change a remote's url

$ git remote set-url [exist remote name] [new remote url]

Use git more elegantly :)

write good commit messages

Here is a model of git commit message:

Capitalized, short (50 chars or less) summary

More detailed explanatory text, if necessary.  Wrap it to about 72
characters or so.  In some contexts, the first line is treated as the
subject of an email and the rest of the text as the body.  The blank
line separating the summary from the body is critical (unless you omit
the body entirely); tools like rebase can get confused if you run the
two together.

Write your commit message in the imperative: "Fix bug" and not "Fixed bug"
or "Fixes bug."  This convention matches up with commit messages generated
by commands like git merge and git revert.

Further paragraphs come after blank lines.

- Bullet points are okay, too

- Typically a hyphen or asterisk is used for the bullet, followed by a
  single space, with blank lines in between, but conventions vary here

- Use a hanging indent

further reading:

Mess

tig

git submodule

my thoughts

这里顺带提下,版本控制系统提供的3个能力:可逆、并行、注解。 参考

the meaning of diff

diff --git a/content/python/package.md b/content/python/package.md
index dc33e96..d013e6b 100644
--- a/content/python/package.md
+++ b/content/python/package.md
@@ -16,9 +16,9 @@ main PyPI server. It also gets cleaned out on a semi-regular b
asis.
     [distutils]
     index-servers=
         pypi
-        test
+        testpypi

-    [test]
+    [testpypi]
     repository = https://testpypi.python.org/pypi
     username = <your username>
     password = <your password goes here>

在以上的例子中,

--- a/content/python/package.md +++ b/content/python/package.md

以上表示的是文件的基本信息,-- 表示变动前的文件, +++ 表示变动后的文件

@@ -16,9 +16,9 @@

以上表示的是变动的位置,- 表示第一个文件,16 表示第16行,9 表示连续的9行。 说明下面的文件内容分别是原来文件和修改后文件的相应位置。


不喜欢拷贝站题哈希值?那就用:

$ git checkout :/"My first b"

来跳到以特定字符串开头的提交。你也可以回到倒数第五个保存状态:

$ git checkout master~5

找出自从上次提交之后你已经做了什么改变:

$ git diff

或者自昨天的改变:

$ git diff "@{yesterday}"

或者一个特定版本与倒数第二个变更之间:

$ git diff 1b6d "master~2"

输出结果都是补丁格式,可以用 git apply 来把补丁打上。也可以试一下:

$ git whatchanged --since="2 weeks ago"

轻快多任务

比如你想并行开发多个功能。那么提交你的项目并运行:

$ git clone . /some/new/directory

Git使用硬链接和文件共享来尽可能安全地创建克隆,因此它一眨眼就完成了,因此你现 在可以并行操作两个没有相互依赖的功能。 例如,你可以编辑一个克隆,同时编译另一 个。感谢 hardlinking, 本地克隆比简单 备份省时省地。

现在你可以同时工作在两个彼此独立的特性上。比如,你可以在编译一个克隆的时候编 辑另一个克隆。任何时候,你都可以从其它克隆提交并拖拽变更。

$ git pull /the/other/clone HEAD

哪儿有错误? Please use git bisect

谁让事情变糟糕了? Please use git blame

忽视提交太久了, 痴迷地编码, use git add -p 为你做的每次修改,Git 将展示给你变动的代码,并询问该变动是否应是下一次提交的一 部分。回答“y”或者“n”。也有其他选项, 比如延迟决定;键入“?”来学习更多。一旦你满意,键入 $ git commit 来精确地提交你所选择的变更(阶段变更)。

如果你修改了许多地方的许多文件怎么办?一个一个地查看变更令人沮丧,心态麻木。这种情况下,使用 git add -i, 它的界面不是很直观,但更灵活。敲几个键,你可以一次决定阶段或非阶段性提交几个文件,或查看并只选择特定文件的变更。 作为另一种选择,你还可以运行 git commit --interactive ,这个命令会在你操作完后自动进行提交。

HEAD好似一个游标,通常指向最新提交,随最新提交向前移动。一些 Git 命令让你来移动 它。 例如: $ git reset HEAD~3

但假设你从来没有记下呢?别担心,像这些命令,Git保存原先的Head为一个叫 ORGI_HEAD的标记,你可以安全体面的返回: $ git reset ORIG_HEAD

在提示符或窗口标题上打印当前分支。调用: $ git symbolic-ref HEAD

git hooks

$ printf "blob 6\000sweet\n" | sha1sum