最近切换到git版本控制来维护代码,记录常用命令如下。另外,推荐git学习的书籍,《Pro Git》。另外,记录一些Git技巧。
初始化本地git仓库
git init
提交文件
克隆远程仓库到本地
git clone git://github.com/schacon/grit.git查看git状态,未提交的文件等
git status比较更改
本地提交代码
git commit
git commit -m "Story 182: Fix benchmarks for speed本地删除代码
本地移动文件
修改远程仓库branch
git push origin :serverfix
主要是配置你的用户名和邮箱。
git config --global user.name "Yu Zhou (yzhou86)"
git config --global user.email "[email protected]"
在你需要下载、提交和操作远程仓库的服务器或pc上,运行如下命令:
#ssh-keygen
一路回车。会在你的用户主目录下生成ssh key。
#ls ~/.ssh
其中一个文件是公钥。复制他的内容。
#cat ~/.ssh/id_rsa.pub
将公钥内容拷贝到git远程仓库admin页面,你的account页面的ssh key中。这样,此台服务器就可以以你的名义连接到git远程仓库。如果有一个空的远程git代码仓库,如何从本地提交代码来初始化远程git代码仓库。
You have an empty repository
To get started you will need to run these commands in your terminal.$ git push --force --set-upstream origin master#
user1 = user11
user21
@
test
.com>
user4
@
test
.com>
|
# 这里只保留了trunk信息,如果你使用标准的trunk/branches/tags方式,请查看--stdlayout用法
# usersmapping.txt为用户映射关系
# 下载时间可能会比较长
git svn clone --no-metadata -A usersmapping.txt https:
//svnhost/csra csra
|
cd csra
git svn fecth
|
cd csra/
|
# Eclipse project files
.classpath
.project
.settings/
# Intellij project files
*.iml
.idea/
# Others
target/
logs/
|
添加文件完成后,commit到本地仓库
cd csra
# 查看变更信息
git status
# 添加文件
git add -A
git commit -m
"init project"
|
cd csra
# 查看远程仓库地址
git remote -v
# 删除老的本地远程仓库地址
git remote rm origin
# 添加新的远程仓库
git remote add origin ssh:
//gituser@githost:port/csra.git
# 下载远程仓库并与本地仓库合并
git push origin master
|
用以下命令可以撤销上一次本地的提交(commit)
git reset HEAD~1
如果你已经把你的本地分支push到了远程仓库分支,但是突然发现有一个commit错了。没问题,你可以解决它。但是你必须快点行动,在其他人fetch错误的commit之前解决问题。
首先有两种替代方案,可以不改变history。
替代方案1:用一个新的commit改正错误。
把错误改正,然后commit。
替代方案2:revert整个commit
例如有一个commit,版本号是dd61ab32,那么直接revert它。
$ git revert dd61ab32
关于改写history:
应该避免改变history,否则已经clone或者fork分支的人,就不能继续从远程仓库pull,因为history已经改变。然而有时候又不得不改变history,可能是为了防止敏感信息的泄露,又或者去除掉错误提交的大文件,或者仅仅是为了让history干净。
在开源项目中,仓库维护者一般决不允许修改history,会组织所有非fast forward的push。
情景1: 删除上一次commit
删除上一次commit是最简单的情景。假设有一个远程仓库mathnet,master分支指向commit dd61ab32。我们希望撤销最近一次的commit。翻译成git的语言就是,我们希望强制mathnet远程仓库的master分支指向dd61ab32的父节点。
$ git push mathnet +dd61ab32^:master
git把x^理解为x的父节点,把+理解为强制的非fast forward push。如果你在本地check out了master分支,你也可以简单2步完成:首先reset分支到当前commit的父节点,然后force-push到远程仓库。
$ git reset HEAD^ --hard
$ git push mathnet -f
情景2: 删除上上一次的commit
我们假设commit dd61ab32不是最后一次提交,而是上上一次。我们想撤销它,但是又想保持它之后的提交继续存在。重写history最简单的方式就是,做一次交互型的rebase,在当前commit和dd61ab32的父节点之间进行rebase。
$ git rebase -i dd61ab32^
这将打开编辑器,列出所有dd61ab32之后的commit。
pick dd61ab32
pick dsadhj278
...
简单地将带有dd61ab32的行去掉,保存并退出。resolve所有的冲突,那么你的本地分支就fix了。force push到远程分支,完成!
$ git push mathnet -f
情景3: 在某一次commit中改正一处错误
Case 3: Fix a typo in one of the commits
这和情景2的方法继续一样,区别在于,不是将错误commit的那些行直接去掉,而是把pick改成edit,然后保存退出编辑器。这样rebase时就会在那个commit处停止,将这个改动放入index,然后让你来改。提交这些改动,继续rebase(git会告诉你如何保持commit message和作者信息,如果你需要的话)。然后将改动push。同样的方法,你甚至可以将commit分解成更小的commit,或者将commit合并。