天行健, 君子以自强不息
Sunny's Blog
Title

git使用总结

1.基本概念

Git库中由三部分组成(索引,仓库,工作目录),.git目录就是仓库,里面存放的就是文档索引内容,.git目录位于工作目录内。

a.工作目录:用户本地的目录

b.Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为索引

c.仓库:将索引通过commit命令提交至仓库中,每一次提交都意味着版本在进行一次更新

2.Git初始化配置

配置git仓库使用人员姓名:git config --global user.name "Your Name Comes Here"

配置使用git仓库的人员email:git config --global user.email you@yourdomain.example.com

查看所有配置信息:git config --list

或者你如果想看某个项目的仓库的详细信息,可以cd .git,然后vim config文件。

3.Git文档的忽略机制

在工作目录下有.gitignore文件。里面可以写需要忽略的文件或文件夹

4.Git help

eg: git help add

5.git init(创建一个空的Git库)

在当前目录中产生一个.git 的子目录。以后所有的文件变化信息都会保存到这个目录下。在.git目录下有一个config文件,可以修改其中的配置信息。

6.git add(将当前工作目录中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步)

添加当前目录下的所有文件和子目录: git add .

添加dir1这个目录: git add dir1

添加f1,f2文件: git add f1.txt f2.txt

7.git rm(从当前的工作目录中和索引中删除文件)

暴力删除文件3.txt,包含本地目录和index中: git rm -f 3.txt

删除文件1.txt,不会删除本地目录文件,只删除index中的文件记录: git rm --cached 1.txt

删除文件目录f1,不会删除本地目录文件,只删除index中的文件记录: git rm -r --cached f1

删除index中的所有文件,相当于要重新add:git rm -r --cached .(有点)

8.git commit(提交当前工作目录的修改内容)

常用:git commit -m "xxxxxx",每一次提交,git就会为全局代码建立一个唯一的commit标识代码,用户可以通过git reset命令恢复到任意一次提交时的代码(后面会说)。

在一个commit id上不断修改提交的内容:git commit --amend –m "message",这个会在你最近一次修改上改动,包括你的注释

9.git status(查看版本库的状态)

可以得知哪些文件发生了变化,哪些文件还没有添加到git库中等等。 建议每次commit前都要通过该命令确认库状态。

10.git log(查看历史日志,包含每次的版本变化。每次版本变化对应一个commit id)

git log -1,-1的意思是只显示一个commit,如果想显示5个,就-5。不指定的话,git log会从该commit一直往后显示。项目版本号应该是唯一的,默认由 Git 自动生成,用以标示项目的某一次更新。如果我们将项目版本号用作git show 命令的参数,即可查看该次项目版本的更新细节。eg: git show 0f40e266ba552692158a4dc4512c001dcb817fe3.

11.git merge(把服务器上下载下来的代码和本地代码合并。或者进行分支合并。)

我一般是合并分支的时候才用merge,合并服务器代码的时候用rebase,例如:当前在master分支上,若想将分支dev上的合并到master上,则git merge dev.

git merge nov/eclair_eocket (是将服务器git库的eclair_eocket分支合并到本地分支上)

git rebase nov/eclair_eocket (是将服务器git库的eclair_eocket分支映射到本地的一个临时分支上,然后将本地分支上的变化合并到这个临时分支,然后再用这个临时分支初始化本地分支)

上面也就解释了为啥rebase的时候是一条直线,因为它相当于只是本地在更新,服务器的那些叉叉不会合进来。

12.git diff

Git diff --cached,比较index和本地仓库中的代码.这个不常用,一般git status就可以看清了

13-1.git checkout(切换到分支)

创建一个新分支,并切换到该分支上: git checkout –b 新分支名 

切换到某个已经建立的本地分支local_branch: git checkout local_branch,(使用cat .git/HEAD后,显示refs:refs/heads/ local_branch)

切换到服务器上的某个分支remote_branch: git checkout remote_branch(远程分支remote_branch可以通过 git branch –r 列出)

切换到某个commit id: git checkout commit_id(使用cat .git/HEAD后,显示commit_id)

切换到某个tag: git checkout tag (使用cat .git/HEAD后,显示tag)

*****重要******* 注意: 除了1)和2)外,其余三种都只是切换到了一个临时的( no branch )状态 (this head is detached),这时用 git branch 可以看到处于(no branch)上, cat .git/HEAD 看到指向相应的commit id。 这个(no branch)只是临时存在的,并不是一个真正建立的branch。 如果此时执行2),则这个(no branch)就自动消失了;如果执行1), 则创建新分支 new branch,并把这个(no branch)挂到这个新分支上,此时cat .git/refs/heads/new_branch 可以看到已经指向了刚才那个commit id。 


13-2.git checkout(用已有分支初始化新分支)

1)切换到某个已经建立的本地分支local_branch,并且使用此分支初始化一个新分支new_branch: git checkout –b new_branch local_branch 
2) 切换到某个远程分支remote_branch,并且用此分支初始化一个新分支new_branch:git checkout –b new_branch remote_branch 
3) 切换到某个commit id,并建立新分支new_branch:git checkout –b new_branch commit_id 
4) 切换到某个tag,并建立新分支new_branch:git checkout –b new_branch tag 


14.git branch(在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支。当第一次执行git init时,系统就会创建一个名为“master”的分支。 而其它分支则通过手工创建)

下面列举一些常见的分支策略:

1.创建一个属于自己的个人工作分支,以避免对主分支 master 造成太多的干扰,也方便与他人交流协作;2.当进行高风险的工作时,创建一个试验性的分支;3.合并别人的工作的时候,最好是创建一个临时的分支用来合并,合并完成后再“fetch”到自己的分支。4.对分支进行增、删、查等操作。 
注意:分支信息一般在.git/refs/目录下,其中heads目录下为本地分支,remotes为对应服务器上的分支,tags为标签。

查看分支: git branch –a/git branch –r,,,,查看当前在哪个分支上也可以用cat .git/HEAD

创建一个分支 
1) git branch 分支名 
虽然创建了分支,但是不会将当前工作分支切换到新创建的分支上,因此,还需要命令“git checkout 分支名” 来切换, 
2) git checout –b 分支名 
不但创建了分支,还将当前工作分支切换到了该分支上。

删除分支:git branch –D 分支名 
注意:删除后,发生在该分支的所有变化都无法恢复。强制删除此分支。

(2017-01-11)批量删除分支:git branch |grep '分支名' |xargs git branch -d 。

比较两个分支上的文件的区别 
:git diff master 分支名 (比较主分支和另一个分支的区别)

查看当前分支的操作记录:git whatchanged

15.git rebase

Git rebase 
一般在将服务器最新内容合并到本地时使用,例如:在版本C时从服务器上获取内容到本地,修改了本地内容,此时想把本地修改的内容提交到服务器上;但发现服务器上的版本已经变为G了,此时就需要先执行Git rebase,将服务器上的最新版本合并到本地。

16.git reset(库的逆转与恢复)

1)硬回:把工作目录下的文件和仓库中的文件都回退,使用git reset --hard HEAD^ 回退第一个记录。git reset --hard HEAD~2 回退第二个记录(在废弃这次修改的时候用)

2)软回:软回是commit的log回退,但是工作目录的文件是不会回退的,但是你需要再add一下(如果用--soft就不用add了),git reset HEAD^ 回退第一个记录 。git reset HEAD~2 回退第二个记录(这个的用处在于如果你在自己的分支上开发,不断提交commit,在最后完成合并到主分支的时候,你希望只有一次干净的提交记录,那么你就会用到软回)

还可以使用如下方法: 
将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C的版本号是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我们执行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么结果就只剩下了A-C三个提交的版本

17.git tag(可以将某个具体的版本打上一个标签,这样就不需要记忆复杂的版本号哈希值字符串了)

例如你可以使用 “git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20” 来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了。

比如你新建一个分支,要用某个tag的代码来初始化,可以git checkout -b new_branch tagName

18.git clone

取出服务器的仓库的代码到本地建立的目录中(与服务器交互) 
通过git clone获取远端git库后,.git/config中的开发者信息不会被一起clone过来。仍然需要为本地库的.git/config文件添加开发者信息。此外,开发者还需要自己添加   . gitignore文件。 
通过git clone获取的远端git库,只包含了远端git库的当前工作分支。如果想获取其它分支信息,需要使用 “git branch –r” 来查看, 如果需要将远程的其它分支代码也获取过来,可以使用命令 “ git checkout -b 本地分支名 远程分支名”,其中,远程分支名为 “git branch –r” 所列出的分支名, 一般是诸如“origin/分支名”的样子。如果本地分支名已经存在, 则不需要“-b”参数。

19.git pull

从服务器的仓库中获取代码,和本地代码合并。(与服务器交互,从服务器上下载最新代码,等同于: Git fetch + Git merge)....但是我还是觉得Git fetch + Git rebase才是最安全的

20.git push

Git push 
将本地commit的代码更新到远程版本库中,例如 “git push origin”就会将本地的代码更新到名为orgin的远程版本库中。

21.git fetch

从服务器的仓库中下载代码。(与服务器交互,从服务器上下载最新代码) 
相当于从远程获取最新版本到本地,不会自动merge,比Git pull更安全些。

22.解决冲突的常规方法

地势坤,君子以厚德载物