git 学习笔记(一) Git实践
网上有很多教程,这里我自己做下整理,省得有时忘记,有道是好记性不如烂博客!
先大概描述下Git的各种命令:
git init #初始化
git clone #将远程项目拷贝到本地
git add # 提交文件更改(修改和新增)
git commit # 基于当前分支提交修改
git reset # 去除某个提交之后的一切提交记录
git log # 查看当前分支下的某个提交记录
git whatchanged # 查看更详细的提交记录,可以看到具体哪些文件做了修改
git status # 查看当前状态
git checkout # 切换分支或者回滚到某个提交
git branch # 创建或查看分支
git merge # 合并目标分支到当前分支
1.Git配置:
Git有三种配置方式,一种是针对全部用户,一种是针对当前用户,还有一种是针对当前工程.
1)全部用户:/etc/gitconfig 通过git config --system进行配置
2)当前用户:~/.gitconfig 通过git config --global进行配置
3)当前工程:.git/config
同时当前工程的配置会覆盖当前用户的配置,当前用户的配置也会覆盖全部用户的配置
我们更多的是针对~/.gitconfig和.git/config进行配置.如可以通过以下命令对当前用户进行配置:
git config --global user.name "userName"
git config --global user.email "[email protected]"
随后我们就可以通过vi ~/.gitconfig或git config --global --list进行查看当前用户的配置
具体配置我们可以通过git help config查看
这里贴上一段对git显示的脚本,方便你使用git命令
git config --global color.ui "auto" git config --global color.diff "auto" git config --global color.status "auto" git config --global color.branch "auto"
2.Git对于文件的管理.
对于Git而言,文件只有两种状态:untracked和tracked,也就是未跟踪和已跟踪.
同时已跟踪文件又分为三种状态:
unmodified:文件没有做过任何修改
modified:文件已经修改了,但还没有提交
staged:文件已经修改,准备提交
3.Git命令的使用
1)在本地创建Git工程,这里我把工程创建到/tmp/workspace下,没有该目录需先创建.然后Git工程名是git-project
cd /tmp/workspace mkdir git-project cd git-project git init
当看到Initialized empty Git repository in /tmp/workspace/git-project/.git/ 就表示已经创建成功
2)提交更新文件(这里请注意,这里的更新包括新增,修改),比如我这里想新增一个说明文件README.TXT,同时提交到Git仓库
echo README > README.TXT git add README.TXT #添加 git commit -m "README" #提交到本地仓库,并说明是README git push #如果是要提交到远程仓库,则还需要使用该命令
3)有时以下记不得具体对工程做了哪些修改,则可以使用git diff,比如
echo README2 > README.TXT # 先修改README.TXT,以便查看内容变化
git diff
然后控制台可以看到如下内容:
diff --git a/README.TXT b/README.TXT index e845566..1a06674 100644 --- a/README.TXT +++ b/README.TXT @@ -1 +1 @@ -README +README2
为了下面的完整性,这里我再将修改README.TXT给提交上去,可以用一条语句搞定:
git commit -a -m "README2"
?? README.HTML
将README.HTML也提交上去
git add README.HTML
git commit -m "create README.HTML"
5) 和git仓库里某个文件内容一致,比如你对一个文件做了些修改,但不想要了,想跟仓库中该文件内容一样,则
echo README3 > README.TXT # 先修改README.TXT,这里用cat README.TXT看到的是README3
git checkout -- README.TXT # 同步git仓库中README.TXT内容,再从README.TXT看到的是README2
可能一次提交了多个文件,但不可能每个文件都git checkout吧.还可以有另外一种方式,通过git log查看你commit的key,再通过git checkout commit_no完成.比如我这里:
commit 1b5c1689dbfad446fbc29a001fd6498e74bb4427 Author: guoyunsky <[email protected]> Date: Mon Dec 26 11:52:46 2011 +0800 create README.HTML commit bc8460c7889aa005f6f056151505c0887c3fd5d5 Author: guoyunsky <[email protected]> Date: Mon Dec 26 11:48:38 2011 +0800 README2 commit 5c7eeb2b31e5f0722cf2bfc038a51fffcea8dfe1 Author: guoyunsky <[email protected]> Date: Mon Dec 26 11:48:10 2011 +0800 README
之前是想回滚到README2,它的commit是bc8460c7889aa005f6f056151505c0887c3fd5d5.
所以我们只需git checkout bc8460c7889aa005f6f056151505c0887c3fd5d5
即可.
这个可以随便切换到任意commit.比如我又想回到README,HTML.
则直接git checkout 1d30434716df7e95a533e20f2973a107eb65b0d1即可
6)GIT 回退 GIT checkout
通过上面git log可以看出git checkout后git仓库中并不会发生变化,包括索引文件和源码.所以这里引入git reset.
比如我这里就只要README这个提交下的源码,README之后的所有修改都是无效的.这也意味着Git仓库中README这个提交是最新.所以需要删除掉README2和create README.html的commit.这里就可以使用git reset了.具体命令如下:
git reset --hard 571d6fac5b8218b40953e478dbb28e41c5511904
同时本地的代码也是README状态!所以这个可是要慎用!因为不仅git仓库没有了相关索引文件和源码,连你本地的源码也被清除,只有README状态下的源码.你可以用git log查看下,发现只有README这个提交了
有时我们有这样一种需求,比如想取消某一次提交,但不想修改本地代码,只是不想在git仓库中提交.我们也可以使用git reset.如我想取消最近一次提交,则可以
git reset --soft HEAD~1
那么你上一次提交就不会反应到Git仓库中去了.
这里介绍下git reset:
git reset HEAD filename #从暂存区中删除文件
git reset –hard HEAD~3 #会将最新的3次提交全部清空,那么仓库中最新的代码应该是HEAD~4,之前三次提交全部没了
git reset –hard commit bc8460c7889aa005f6f056151505c0887c3fd5d5 #回退到bc8460c7889aa005f6f056151505c0887c3fd5d5 版本
git reset –mixed #此为默认方式,不带任何参数的git reset,回退到某个版本,只保留源码,回退commit和index信息
git reset –soft #回退到某个版本,只回退了commit的信息,不会恢复到index file。如果还要提交,直接commit即可
git reset –hard #彻底回退到某个版本,本地的源码也会变为上一个版本的内容
7)修改文件名,这里不在是修改文件内容.修改文件名的话,比如这里修改README.TXT为readme.txt,对于Git来说,是删除了README.TXT新增了readme.txt文件.我们可以通过git status来查看
# On branch master # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: README.TXT # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # readme.txt no changes added to commit (use "git add" and/or "git commit -a")
但Git不可能这样弱智,可以使用git mv README.TXT readme.txt,如发生错误可以视情况强制执行:git mv -f README.TXT readme.txt,再通过git status查看:
# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: README.TXT -> readme.txt #
8) Git删除文件
git rm HEADME.TXT
git commit -m "delete README.TX
以上会在git仓库中删除README.TXT,同时以后也不会再跟踪这个文件.如你输入git diff则不会再拿这个文件去对比.但有时我们只想删除跟踪这个文件,但还想在git仓库中保留这个文件.则可以使用这个命令:
git rm --cached README.TXT
9)Git分支 git branch
分支是个永恒的概念,比如很多开源程序都有版本以及不同的功能实现.如Hadoop被用到各个方面.
git branch branch_name #创建分支
git branch -r #查看远程分支,也就是你git仓库里有哪些分支
git branch -a # 查看所有分支,远程和本地
git branch --no-merge # 查看所有未合并的分支
git branch --merge # 查看所有已合并的分支
git checkout branch_name # 切换到某个分支
git checkout -b branch_name # 创建并且切换到某个分支
git branch -d branch_name # 删除某个分支,仅能删除合并了的分支
git branch -D branch_name # 删除某个分支,未能合并的分支也能删除
git merge dest_branch # 将目标分支合并到你当前分支
以上只是命令,这里来个实践.我们重新建个git工程.也算是对git有个大概的使用
#创建git工程
mkdir git-branch-test
cd git-branch-test
git init
echo "test" > test.txt
git add test.txt
git commit -m "test" #提交到master分支
git checkout -b test #创建并进入test分支
echo "test2" >> test.txt #追加文件内容到test.txt,如此test分支中test.txt文件内容已修改
git add test.txt
git commit -m "test2" #提交到test分支
git checkout master #切换到master分支
echo "test3" >> test.txt #追加内容到test.txt,如此master分支中test.txt文件内容又有修改
git add test.txt
git commit -m "test3" #提交到master分支
经过以上命令,我们知道master分支中提交过两次,test.txt文件内容是test test3.而test分支也同样提交过两次,内容是test test2.这里我们将test分支合并到master中:
git checkout master
git merge test
之后再跟test.txt文件内容为如下:
test <<<<<<< HEAD test3 ======= test2 >>>>>>> test
可以看到合并之后有冲突,那需要我们根据实际情况处理.
局域网内搭建小组级git服务器:
http://www.cnblogs.com/wangshuai901/archive/2012/02/22/2362924.html
github fork后合并主库的代码
https://segmentfault.com/q/1010000002590371
更多技术文章、感悟、分享、勾搭,请用微信扫描: