Ubuntu下git的安装和使用
系统:Ubuntu 15.05
玩开发板的时候要修改很多代码,有增添的有删除的有原基础小修改的,有时还要写一些测试程序,有时甚至要整个项目分好几个版本。原本,我在修改代码的时候采取的是注释的形式,写明这行是我添加的,这部分是我注释的。
当项目是线性的时候这种方法当然很好,但是我想在此基础上有没有更完善的管理代码的方式?比如,我对linux3.0移植了A功能和B功能,某天我要对linux移植A功能和C功能,但又不想保留B功能。按照以前的做法就是注释掉一切B功能的代码然后加上C功能,但如果某天我又想用到包含B功能的那个版本的时候希望能快速切换回去,那么这种一个个文件去改的方式就会很累,当然以我目前对嵌入式的移植能力还算不上累,但是以后总会遇到复杂的项目。复杂项目里面肯定会有很多版本迭代,版本间还不是线性的,而是像树状的,如果纯靠人脑我没有这个能力。
大概这个样子:
我想linus在很多年前也是这样想的,所以他自己写了一个代码管理软件git。为什么我不用SVN?因为我看到知乎里面好多人管理代码都用github,所以我就跟风了。
安装git
Ubuntu下安装git可以用apt-get直接安装。
zhou@zpc:~$sudo apt-get install git-core
安装好后我们建立一个目录来尝试用一下
zhou@zpc:~$mkdir git
zhou@zpc:~$ cdgit
我们要对git进行一些配置,添加我们的用户名和邮箱,这是为了方便git对代码管理时知道是谁进行了修改。
zhou@zpc:~/git$git config --global user.name zhouqing
zhou@zpc:~/git$gitconfig --global user.email [email protected]
git下有很多命令很多功能,我们试一下最简单的,复杂的我还没学会。
zhou@zpc:~/git$git init
初始化空的 Git 版本库于/home/zhou/git/.git/
zhou@zpc:~/git$git status
位于分支 master
初始提交
无文件要提交(创建/拷贝文件并使用 "gitadd" 建立跟踪)
zhou@zpc:~/git$git log
fatal: baddefault revision 'HEAD'
git init是建立一个仓库,就是说该目录以下包括所有子目录下的内容都纳入git的管理了。
Git status查看当前状态,我们位于主分支,当然以后可以创建其他分支。
Git log查看日志,现在什么都没有,会报错。
现在模拟写代码过程
zhou@zpc:~/git$echo 1 > code.c
zhou@zpc:~/git$git add code.c
zhou@zpc:~/git$git commit -m "write 1 to code.c"
[master (根提交) 23a3b8f] write1 to code.c
1 file changed, 1 insertion(+)
create mode 100644 code.c
我们创建了一个code文件,里面第一行写入1。Git add将文件添加进暂存区,gitcommit将所有暂存区的文件提交,-m后为注释。
zhou@zpc:~/git$git log
commit23a3b8fdfe5a7e9f81201cd2b8e80b05be1dcdbe
Author:zhouqing <[email protected]>
Date: Wed Aug 5 11:05:06 2015 +0800
write 1 tocode.c
查看log我们看到了修改信息,commit后面的一串符号用来唯一地表示某一次提交,下面可以看到当次做了哪些更改,谁更改的。
我们再次修改code文件
zhou@zpc:~/git$echo 2 >> code.c
zhou@zpc:~/git$cat code.c
1
2
zhou@zpc:~/git$
在1后面再添加一行,写入2。然后添加提交
zhou@zpc:~/git$git add code.c
zhou@zpc:~/git$git commit -m "add 2 to code.c"
[mastere587d0c] add 2 to code.c
1 file changed, 1 insertion(+)
zhou@zpc:~/git$git log
commite587d0c43ce0ef9afe4d9770a78d98a5766986b4
Author:zhouqing <[email protected]>
Date: Wed Aug 5 11:10:59 2015 +0800
add 2 to code.c
commit23a3b8fdfe5a7e9f81201cd2b8e80b05be1dcdbe
Author:zhouqing <[email protected]>
Date: Wed Aug 5 11:05:06 2015 +0800
write 1 tocode.c
日志里记录了两次修改的痕迹。因为当前最新记录为e587d0(一般可以用前面几个字符表示就行了,不用敲完全部,但要保证不和其他的相同),我们对比一下和前一个提交有什么不同
zhou@zpc:~/git$git diff 23a3b8f
diff --gita/code.c b/code.c
indexd00491f..1191247 100644
--- a/code.c
+++ b/code.c
@@ -1 +1,2 @@
1
+2
可以看到添加了2,像我们用过的补丁文件一样。
某天我们发现代码写错了,要回滚
zhou@zpc:~/git$ git reset --hard 23a3b8
HEAD 现在位于 23a3b8f write 1 to code.c
zhou@zpc:~/git$ git log
commit23a3b8fdfe5a7e9f81201cd2b8e80b05be1dcdbe
Author: zhouqing<[email protected]>
Date: Wed Aug 5 11:05:06 2015 +0800
write 1 to code.c
zhou@zpc:~/git$ cat code.c
1
我们看到第二次提交的日志被删除了,文件也恢复到了第一次提交的结果。如果我们想保留提交的痕迹呢?
重新将2写进code文件中
zhou@zpc:~/git$ echo 2 >> code.c
zhou@zpc:~/git$ git add code.c
zhou@zpc:~/git$ git commit -m "add 2to code.c"
[master 045e611] add 2 to code.c
1file changed, 1 insertion(+)
zhou@zpc:~/git$ git log
commit045e611a4e70d2dd88c6b8fea593370313c2eecf
Author: zhouqing<[email protected]>
Date: Wed Aug 5 11:20:04 2015 +0800
add 2 to code.c
commit23a3b8fdfe5a7e9f81201cd2b8e80b05be1dcdbe
Author: zhouqing<[email protected]>
Date: Wed Aug 5 11:05:06 2015 +0800
write 1 to code.c
新的记录号为045e61,
zhou@zpc:~/git$ git revert 045e611
[master 40c437b] Revert "add 2 tocode.c"
1file changed, 1 deletion(-)
zhou@zpc:~/git$ git log
commit40c437b5c656c23ca4ff98064682fa08413780ed
Author: zhouqing<[email protected]>
Date: Wed Aug 5 11:20:45 2015 +0800
Revert "add 2 to code.c"
This reverts commit 045e611a4e70d2dd88c6b8fea593370313c2eecf.
commit045e611a4e70d2dd88c6b8fea593370313c2eecf
Author: zhouqing<[email protected]>
Date: Wed Aug 5 11:20:04 2015 +0800
add 2 to code.c
commit23a3b8fdfe5a7e9f81201cd2b8e80b05be1dcdbe
Author: zhouqing<[email protected]>
Date: Wed Aug 5 11:05:06 2015 +0800
write 1 to code.c
zhou@zpc:~/git$ cat code.c
1
我们对该记录号进行撤销,注意这是revert不是reset,reset是回到某个记录号,revert是撤销某个记录号,reset会删除日志,revert不会。通过git log我们看到了三条记录,第二条为添加2到code,第三条为取消第二条提交。
其实git能实现的功能还有很多,这只是一小部分,关于git背后的知识可以看这里:
Git历险记(一)
http://www.infoq.com/cn/news/2011/01/git-adventures-1
Git历险记(二)——Git的安装和配置
http://www.infoq.com/cn/news/2011/01/git-adventures-install-config
Git 历险记(三)——创建一个自己的本地仓库
http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository
Git历险记(四)——索引与提交的幕后故事
http://www.infoq.com/cn/news/2011/03/git-adventures-index-commit
Git历险记(五)
http://www.infoq.com/cn/news/2011/03/git-adventures-branch-merge
最后是福利