首先说一句,git跟踪并管理的是修改,而非文本。(18年的五四青年节,今天在做好一个项目的需求之后,需要重置工作区的修改,还有从远程上克隆下来(git clone url 默认是只会克隆master分支下的东西),然后再新建一个分支干活,干完活之后再提交到新建分支上,然后再提merge请求,进行合并,这里再简单复习一下git的命令,还有补充总结一下)
这里有一个简化的图,有助于更好的操作git。
这里有一些常用的命令,总结一下,以便日后查看。
撤销工作区里面所做的修改(修改本地仓库中的文件后,执行git add之前)
git checkout -- filename(readme.txt)
:这个命令是将工作区里面的修改全部撤销。这里有两种情况:
- 在工作区中修改之后,还没有提交到暂存区,执行
git checkout -- readme.txt
之后,会回到工作区之前没有修改的状态 - 在工作区中修改后已经提交到暂存区,然后又做了修改,这时候执行
git checkout -- readme.txt
之后,会回到提交到暂存区的状态
总的来说,git checkout -- filename
这个命令会将文件退回到最近一次的git commit或者git add时的状态。这个过程可以使用git status
查看版本库的状态
撤销暂存区里面所做的修改(执行git add 之后,git commit之前)
git reset HEAD filename(readme.txt)
:可以撤销暂存区里面的修改到工作区,git reset
也可以回退版本。这个过程也可以使用git status
查看版本库的状态
撤销已经从暂存区提交到版本库的修改(执行git commit之后,git push之前)
在这个过程中,版本控制系统可以告诉我们的历史记录,这个命令是git log
,可以查看git commit的历史记录。
$ git log
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
commit ea34578d5496d7dd233c827ed32a8cd576c5ee85
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 14:53:12 2013 +0800
add distributed
commit cb926e7ea50ad11b8f9e909c05226233bf755030
Author: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 19 17:51:55 2013 +0800
wrote a readme file
如果觉得输出信息有点乱的话,可以添加--pretty=oneline参数
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0(这一串数字是commit id,即版本号) append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
版本回退
既然是版本回退,就需要知道当前是出于哪个版本,一般当前的是HEAD,上个版本是HEAD,上上个版本是HEAD^,上100个版本可以是HEAD~100.
git reset --hard HEAD^
: 用于回退到当前版本的上一个版本
git reset --hard HEAD^^
:用于回退到当前版本的上上个版本
git reset --hard 版本号
:用于回退到指定的版本号
当你回退到之前的某个版本,然后下班回家了,明天早上想回到未来的某个版本,可以使用git reflog查看版本号
git reflog
: 记录你执行的每一次命令,以确定回到未来的哪个版本
1.git reset HEAD filename
2.git checkout --filename
上面这两步一起使用:适用于不但改乱了工作区某个文件的内容,还添加到暂存区,想丢弃修改的情况。
`git reset --hard HEAD^^` :
回退到当前版本的上上个版本(前提是没有推送到远程仓库)
`git remote add origin 远程仓库的地址` :将本地的仓库与github的仓库想关联。
`git fetch`命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,确定好了,自己手工合并`git merge`
`git clone` 克隆一个仓库,会自动将远程仓库归于origin下,git fetch origin 会抓取从你克隆以来别人上传到远程仓库中的所有更新。初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,且状态为未修改,在编辑过某写文件之后,Git将这些文件标为已修改。还有克隆之后,本质上自动创建本地master分支用于跟踪远程仓库中的master分支。
`git clone -b 分支名 仓库地址`:克隆远程某个分支到本地
`git diff` :比较工作目录中当前文件和暂存区域中快照之间的差异
`git diff --cached` 查看已经暂存起来的文件和上次提交的时候的快照之间的差异
注意:从git中移除某个文件,必须从暂存区中移除,然后提交。
`git rm` :从工作目录中删除指定的文件,以后就不会出现在未跟踪文件清单中。
`git rm --cached readme.txt` 移除跟踪但不删除文件
`git remote show [remote-name]`: 查看远程仓库详细信息
`git remote rm` :删除远程仓库,当然不止这一种方法。
`git branch [branch-name]` :创建一个分支,但不会切换到此分支下,还是在master分支下。
`git checkout [branch-name]`: 切换分支(注意:最好保持一个清洁的工作区域之后再切换分支)
`gitk -a`:运行这个命令可以打开一个图形界面,可以看到清晰的历史记录,不同分支之间的关系情况。
`git merge 分支名(aa)`:将某个分支aa合并到当前分支
`git pull 远程主机名 远程分支名:本地分支名`:取回远程主机名的某个分支的更新,再和本地指定分支进行合并,如果远程分支是和当前分支名进行合并,则本地分支名可以省略。
`git push 远程主机名 本地分支名:远程分支名`:注意分支推送顺序和git pull的区别,如果省略远程分支名,是将本地分支推送到与之存在跟踪关系的远程分支,如果不存在则会创建。
`git rebase 分支名(bb)`:将bb分支合并到当前分支
####另附两个讲的详细的链接
https://www.cnblogs.com/marblemm/p/7161614.html 这个链接是讲的git merge和git rebase的区别,讲的挺详细的。
https://www.zhihu.com/people/caseby/answers 这篇文章写得很好,在开发过程中使用git merge还是git rebase,优缺点是什么。