GIT版本控制系统
学习和使用git也已有几个月时间,今将所学知识做一总结,特写此文。
首先欢迎大家使用Git, 它是一个快速的分布式版本控制系统,现在越来越多的开源项目也都迁移到GIT上了。可以说是旅行必备、居家良伴、送礼自用两相宜的VCS(版本控制系统),下文涵盖了一些基础的和较常用的git操作,应该足以应对日常的工作需要,读者如有疑惑还需自己google解决:p
--------------------------------------------------------------------------------------------------------
1 GIT配置
使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名。
git config --global user.name “your_name”
git config --global user.email “your_name@company.com”
git config --global color.ui true
git config --global core.editor vi
2 SSH-KEY
3 GIT ALIAS
一些好用的git alias,让我想起了项目中之前使用过的CVS版本控制系统
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
这样只要输入git st 就是git status 了,git 设定档的位置在~/.gitconfig,你也可以直接修改这个档案。
4 忽略某些文件
项目中经常会生成一些Git系统不需要追踪(track)的文件,典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以平时不用"git add"去把它们加到索引中。但是这样会很快变成一件烦人的事,你发现项目中到处有未追踪(untracked)的文件; 这样也使"git add .
" 和"git commit -a
" 变得实际上没有用处,同时"git status
"命令的输出也会有它们。你可以在你的顶层工作目录中添加一个叫".gitignore"的文件,来告诉Git系统要忽略 掉哪些文件。
你也可以把".gitignore" 这个文件放到工作树(working tree)里的其它目录中,这就会在它和它的子目录起忽略(ignore) 指定文件的作用。.gitignore
文件同样可以像其它文件一样加到项目仓库里( 直接用git add .gitignore
和 git commit
等命令), 这样项目里的其它开发者也能共享同一套忽略 文件规则。
5 正常的工作流程
vi test.cpp
git status
git add test.cpp
git commit -m "message"
6 修改COMMIT(push之前可以做的事情)
git reset HEAD^ (留着修改在working tree)
git reset HEAD^ --soft(修改放到staging area)
git reset HEAD^ --hard(完全清除)
--------------------------------------------------
快速修正上一个commit(比如说之前的commit有typo)
git reset HEAD^
edit files
git commit –am “message”
7 TAG
git tag PROJECT_NAME_20130513 (轻量级标签)
git push origin PROJECT_NAME_20130513 (推到远端repo中)
git checkout PROJECT_NAME_20130513 (貌似和分支间切换一样?)
-------------------------------------------
git tag -d PROJECT_NAME_20130513 (删除本地tag)
git push origin :refs/tags/PROJECT_NAME_20130513 (用push删除远端tag,注意origin和冒号间有空格)
8 关于分支的一些操作
git branch <new_branch_name> (建立本地local branch)
git branch (列出目前有哪些branch以及目前在那个branch)
git checkout <branch_name> (切换branch ,如果你有档案修改了却还没commit,会不能切换branch)
git checkout --track -b branch_20130415 origin/branch_20130415
(从远程仓库拉分支并立即切换到该分支,加上--track表示你之后还要pull、push回去,所以请Git记住对应关系)
git branch --set-upstream branch_20130210 origin/branch_20130210
(将一个已经存在的branch设定成tracking远端的branch)
git push origin local_branch_name: remote_branch_name (将本地的分支push到remote)
git branch -m <old_name> <new_name> (改名字,如果有同名会失败,改用-M可以强制覆盖)
git branch -d <branch_name> (删除local branch)
git push origin :branch_name (删除remote branch,注意origin和冒号间有空格)
9 [git commit -a] and [git add] 的区别
I’ve heard or read too many git blog posts/pod casts state that if you create a new file in your local Git repo and you want to shorten the steps on getting it added to the local repository, all you have to do is:
git commit -am "my commit message"
This is _not_ true. If the file has never been added to the repo prior, then you still have to:
git add <file_name>
Why?
The “git commit -a” command is a shortcut to a two-step process. After you modify a file that is already known by the repo, you still have to tell the repo, “Hey! I want to add this to the staged files and eventually commit it to you.” That is done by issuing the “git add” command. “git commit -a” is staging the file and committing it in one step.
If you create a new file, edit it, and issue the “git commit -a” command, you will see something like:
~ > mkdir test ~ > cd test ~/test > git initInitialized empty Git repository in /Users/jasonmeridth/test/.git/ ~/test(master) > touch test ~/test(master) > git commit -am "initial commit" # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test nothing added to commit but untracked files present (use "git add" to track)
The “nothing added to commit but untracked files present” is the key comment. Git even suggests using “git add” to track the file. See, it’s user friendly.
Just be aware.
--------------------------------------------------------------------------------------------------------
个人喜欢的命令:
git log -p (会列出不同提交之间的差异内容,如果修改量不大的话,看起来很清爽)
git log --stat (会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容)
git log --pretty=format:'%h : %s' --topo-order --graph (用ASCII字符来画出一个很漂亮的提交历史线,要是喜欢就写个宏好了)