Total Pageviews

Tuesday, 12 February 2013

有关git

看到一个关于git的介绍视频Introduction to Git with Scott Chacon of GitHub,我认为讲的非常不错。这里将就把有关git的笔记整理一下。

1. 把branch给push上去:

git push remote_name branch_name
git push默认动作为:git push orgin master。
若你现在在my_good分支,而git push my_remote被拒绝,可能是因为默认补全为 git push my_remote master,而my_good和master有冲突。此时可以选择push到新的分支 上:git push my_remote my_good,或者在本地与master解决冲突并合并以后再push。

把远端branch删除:
git branch ‑d branch_name #这个是删本地branch,要只删除远端branch不要这句也可以。
git push remote_name :branch_name

2. github上显示的头像是取决于配置的email信息,使用下面命令修改配置(查看配置使用git config ‑l):
git config ‑‑global ‑‑unset github.user
git config ‑‑global ‑‑unset github.token 

git config ‑‑global user.name "Your Name Here"
git config ‑‑global user.email "your_email@youremail.com"
email可以填写torvalds@linux‑foundation.org,在Github上的头像和链接就是Linus。

3. 关于clone
git clone ADDR 就相当于:
git init
git remote add origin ADDR #当然这里origin你可以替换成任何名字,但是git clone默认是它而已。
git fetch origin
git branch ‑a #可以用这个显示包括remote分支在内的所有分支 
git checkout remotes/origin/master
此时还在一个detached的特殊分支上(显示为no branch),输入:
git checkout ‑b master # ‑b是建立一个branch并切换到它(等价于git branch master; git checkout master)。
新建一个分支并切换到它,这个时候它就和其他分支一样了。

其中,git remote的地址可以是本地路径(如../some/dir)或者http[s]、ssh、git协议。如:
git remote ‑v
origin git@github.com:t‑k‑/tknet.git (fetch)
origin git@github.com:t‑k‑/tknet.git (push)
git@...这样的地址形式是ssh,push需要在本地和github那里设置ssh key。
不像 https://github.com/t‑k‑/tknet.git 那样输入用户名、密码就可以push。

4. 用alias功能缩写:
git config ‑‑global alias.lol "log ‑‑graph ‑‑oneline ‑‑all ‑‑decorate ‑‑color"
以后就可以使用git lol来图形化地显示所有分支及commit名字。
git config在一个没有git init过的目录会提示 error: could not lock config file .git/config: No such file or directory, 可见.git/config就是git config所配置的文件。如果不用选项‑‑global则只会作用于当前目录下的.git/config。

5. 关于fork
github里的fork其实等价于:在github里建立名为abc的一个repository,然后把要fork的clone到本地,使用:
git remote add a_repo ADDR/abc.git
git push ‑u a_repo <当前要push的branch的名字,如master> # 这个‑u参数是必需的,主要作用是set up upstream, 需要在初始化abc仓库的时候使用
把别人的branch复制到了自己的github账户下。

6. 关于Pull Request
github里的Pull Request概念相当于:
我发一封Email告诉 被fork的那个人,嘿,我这里有ADDR/abc.git,帮你添加了很多NB的功能,你要不pull一下?
而git中的pull就等价于fetch以后merge。(merge以后如果没有冲突就不用再commit了,直接push就行了)

注意git merge只会作用于当前的branch,比如 git merge branch_a 命令只会让当前branch改变(被合并),branch_a不会改变。

7. 修改最后一次commit:
若commit以后发现还要加东西,或者需要改commit描述,可以使用这条非常有用的命令:
git commit ‑‑amend