PKUWWT

消遣时光

git使用笔记

帮助系统

git --help
man git
man git add
git help add

创建仓库

创建git本地仓库

mkdir myrepo
cd myrepo
git init

如果只想创建bare仓库,则使用--bare参数。bare仓库中存的是原仓库的.git目录中的内容,即逻辑上原仓库存了两份内容,而bare仓库只存了一份。

git init --bare

将本地仓库拷贝到另一本地仓库

git clone file:////home/username/myrepo another-dir

这样,你的another-dir中就有一个拷贝了,注意,这里的another-dir/.git/config中有了[remote "origin"]项,它的值就是file:////home/username/myrepo

将仓库变成bare仓库,使用git clone --bare即可。

参数设置

git config --get user.name
git config --get user.email
git config --global user.name "yourname"
git config --local user.name "yourname"

全局参数一般存于~/.gitconfig中,仓库myrepo的局部参数存于myrepo/.git/config中。

上传下载

常用的一条上传到其它仓库的命令是

git push origin master

它的含义可以看.git/config文件,它里面有[remote "origin"][branch "master"]两项才能进行这个操作。origin的值为另一个仓库的地址,而master表示当前仓库的主分支。

git push相对的一条操作是git pull,你也可以显式地指定git pull origin。即从origin抓取内容过来。

使用U盘作为bare仓库

如果需要经常在两条电脑之间进行代码拷贝,而又没有网络条件,则只好考虑使用U盘作为一个中转站或服务器。

假设,机器A上已经有一个本地仓库repoA了,那么,我们需要有用它来在U盘上生成一个bare仓库bareRepo

git clone --bare file:////path/to/repoA /usb/path/to/bareRepo

然后,在机器B上可以与U盘上的bare仓库进行交互了,可以用bareRepo生成一个本地repoB

git clone file:////usb/path/to/bareRepo /path/to/repoB

kdiff3工具,你会发现repoArepoB之间除了.git目录之外,其它的内容都是完全一样的,即使是.git目录,也只是个别文件不同,你试一下git log命令,发现三个仓库结果都是一样的。

现在,在repoA中进行修改,然后上传至bareRepo中。且慢,我们从repoA得到bareRepo,再从bareRepo得到repoBrepoA本身可不知道bareRepo的存在性,也就是说repoA中的origin并不是bareRepo的地址。那么有两个选择,要么删除repoA,再从bareRepo生成一个repoA,要么修改其origin。方法是

cd /path/to/repoA
git config --local remote.origin.url "file:////usb/path/to/bareRepo"

上面命令的意义,参看.git/config内容便知。

修改repoA,然后上传。

cd /path/to/repoA
echo "hello" >hello
git add hello
git commit -a
git push origin master

repoB中接收这些修改

cd /path/to/repoB
git pull origin

当然,如果repoArepoB同步修改,上传之前,先git pull一下,在本地解决冲突之后,再git push。但对于个人来说,这种情况很少出现。

修改

刚提交一个,但消息(日志)是错的,如何修改? 下面的命令会用EDITOR指定的编辑器打开最后一次提交的日志内容。后面还可以加-m选项,即直接指定日志内容,而不进入编辑器。

git commit --amend

其它

git add newfile之后git commit -a之前,撤销add操作

git reset newfile

撤销git commit -a操作

git revert

修改最近一次提交。

git commit --ammend

如果git commit -agit push之后修改最后这次提交,则会与远程状态不一致,导致再次git push失败。这时应该先git pull一下进行合并,再git push。当然,也可以强行git push -f

修改最近3次的提交信息

git rebase -i HEAD~3

然后弹出一个编辑器,以旧到新的顺序列出了这最近3次的message,一个commit占一行,以pick开头,将pick改成edit表示要修改这次commit。保存后退出,git会告诉你接下来怎么做,即执行

git commit --ammend
git rebase -continue

git rebase -i相当于将git的状态移至了倒数第3次提交之前,然后git commit --ammend只不是正常的修改当前提交,最后,git rebase -continue将状态向后恢复到最新的那次提交。注意,这样操作之后,git push是不行的,因为和远程仓库有冲突。这时需要git pull一下,会新增加一个合并的提交,然后再git push。参考自[[http://git-scm.com/book/en/v2/Git-Tools-Rewriting-History]]。

下载某一特定分支

git clone -b gitcafe-pages git://gitcafe.com/pkuwwt/d3-tutorial-cn.git

新建分支并切换至此新分支

git checkout -b newBranch

相当于

git branch newBranch
git checkout newBranch

查看当前主分支(branch)

git branch

合并另一分支branchA到当前分支

git merge branchA

从branchA切换到另一个branchB(branchB已经存在)

git checkout branchB

将branchA的一个文件或目录复制到当前branch

git checkout branchA -- path/to/your/file
git checkout branchA -- path/to/your/directory

删除分支时不能删除当前分支。

git branch -d branchToBeDelete

添加多个远程仓库

git remote add newRepoName newRepoMachine:/path/to/repo

这样,push到此仓库可以执行

git push newRepoName master