Git学习心得

Git 学习心得

参照廖雪峰老师的Git教程

Git命令

git init

用于在一个文件夹中创建git的一些仓库文件信息,可以用ls -a查看该文件

git add “filename”

用于将文件添加到本地的仓库,可以看做是把文件添加到一个暂存区中

git commit -m “comment”

用于将暂存区中的文件添加到仓库中, -m后面的comment是对本次提交的说明

git status

查看工作区(文件夹)中是否有文本文件发生过改动,也就是把工作区和版本库的内容对比

git diff

如果git status命令报告有文件修改过,那么可以用git diff查看具体的修改内容

git diff显示内容的意义:

减号’-‘表示上一次提交到仓库中的文本内容,加号’+’表示本次修改后的文本内容。
@@ -1,3 +1,5 @@ 表示上一次提交的文本有3行,本次修改后有5行
若显示的内容前面没有’+’和’-‘,说明这是两个文本共有的
显示的内容前面有’+’说明是本次修改后的文本独有的
显示的内容前面有’-‘说明是上一次提交的文本独有的。

git log

使用git log可以查看commit的记录,加上参数 –pretty=oneline可以只显示版本号和注释

git reset

版本之间进行回退与恢复,完整命令为:git reset –hard HEAD
其中HEAD
是表示回退到当前版本的上一版本。因为HEAD相当于一个指针,指向当前分支,^表示向前一个版本,若要回到当前版本的前n个版本,可以把HEAD改为HEAD~n

以上的命令为向前回退,若要向后恢复,那么可以通过版本号的查找恢复:

使用git log可以查看到版本号,然后可以通过把–hard后面的参数改成版本号,即可恢复到后面的版本,如果通过git log无法查看到想要恢复到的版本号,那么可以使用git reflog查看之前打过的git命令,从而找到版本号

工作区 和 版本库 的关系


通过git init创建了版本库,然后每次要把工作区(文件夹)中的文本提交到版本库中都是先用git add命令提交到stage(暂存区),然后用git commit命令提交到master分支中,前面说的版本之间的回退与恢复也是在master中利用了版本号,而HEAD指针指向master最后一个版本号(当前版本)
在commit之后使用git status,显示工作区clean,表示暂存区的内容与最近一次提交同步,但是暂存区还是有内容的。
如果在修改之后没有add到暂存区,那么commit是不会把最新的修改提交到版本库当中的。因为commit只是把add到stage中的修改提交到版本库。

git diff –cached

用于查看暂存区(stage)与上一次最近一次commit的内容有无不同。

git diff HEAD –filename

用于对比版本库master分支中的最近一次修改的文件与本地文件的不同

撤销修改的方法

git checkout – filename

用于把工作区(文件夹)的修改撤销,用版本库中的版本替换掉工作区的版本,前提是没有用add添加到暂存区

git reset HEAD filename

用于把暂存区的修改撤销,但是并没有撤销工作区的修改,这时可以通过git checkout命令撤销工作区的修改

git reset –hard HEAD^

如果没有提交到远程版本库,可以用版本回退撤销修改,否则就不能撤销了。

git rm filename

用于把版本库中的内容删除掉,此时工作区中的内容也被删掉了,如果误将工作区的内容删掉,但是版本库中还未删除,则可以用git checkout –filename用版本库中的内容恢复到工作区中

远程仓库

1st step:创建SSH KEY

ssh-keygen -t rsa -C “email”用于生成一对公钥私钥

然后在github网站中添加ssh key,就可以在以后提交到github仓库的时候通过认证,表明身份。

2nd step:在github新建仓库,关联本地仓库

git remote add origin git@server-name:path/repo-name.git
注意:origin是远程仓库的名字,可以修改,但是一般默认是origin,后面的repo-name是在github新创建的仓库的名字。在执行本条命令的时候需要在本地仓库中执行,也就是在已经进行过git init的文件夹中执行。
git push -u origin master

3rd step:推送修改到github仓库

在关联后第一次推送是推送master分支的内容到远程仓库的master分支,并与之关联,所以第一次推送需要用到-u 参数
git push -u origin master
再以后的推送中,不需要使用-u参数
git push origin master 这是把本地master分支推送到远程仓库中

4nd step:克隆到本地仓库

git clone ssh-address
其中ssh是指那个远程仓库的ssh协议地址,使用ssh协议速度快,但是可能在公司内部无法使用,需要使用https协议地址,但是本质都是一样的。通过git clone命令可以把远程仓库的内容全部克隆到当前文件夹中并新建一个文件夹命名为远程仓库的名字

分支管理

每一个分支都相当于一条时间线,有自己的指针,指向最后提交的版本号,HEAD指向的是当前分支的指针

创建并切换分支

默认是只有一个master分支,可以随意进行切换
创建分支:git branch new_branch_name
切换分支:git checkout new_branch_name
当然也可以只用一条命令创建并切换分支:git checkout -b new_branch_name

git branch 查看当前分支,分支前面标有*的是当前分支

git merge branch_name 合并分支到当前分支

git branch -d branch_name 删除分支

合并分支

在合并分支的时候可能出现冲突,需要手动解决冲突之后才能自动合并分支。如果没有冲突,就可以用前面所写的命令git merge branch_name 合并分支到当前分支
如果有冲突,可能是如下的情况,两条分支都有新的提交:

这时候不能自动合并分支,这时候可以用git status查看导致冲突的文件是什么,然后手动修改即可,如下面的冲突情况:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
==== = = =
Creating a new branch is quick AND simple.
.>>>>>>> feature1

其中<<到>>的是冲突的地方,在行末都有标出冲突的分支是什么,用==分割出有冲突的具体内容,可以修改这一整段以解决冲突
冲突解决后的分支情况如下:

使用带参数的git log查看分支合并情况:
git log –graph –pretty=oneline –abbrev-commit

一般来说,不需要用到的分支要及时删除掉。

一个小问题

在使用git merge的时候,是用了fast forward模式,这样的话用git log是看不出来进行过分支合并,而有时候需要在log中记录合并的信息,就需要用到普通模式(递归模式)进行合并分支
git merge –no-ff -m “comment”
在普通模式下合并分支可以加上注释。合并后可以从历史中看出合并记录:

通常master只发布稳定版本,在dev分支中进行开发,而每个成员在自己的分支中开发,然后提交到dev分支,最后经过测试才提交到master分支

修复bug

在修复bug的时候需要单独创建一个分支以处理bug,在这时候可能正在dev分支进行开发,所以需要先保存dev现场,但是不是提交到仓库中。
git stash 命令可以保存当前分支的内容,就像是函数调用一样,现场保护之后可以在之后恢复。

在保存完现场之后可以去到需要修复bug的分支进行修复,最后回到dev分支继续开发,但是这时候git status显示工作区是clean的,因为已经把所有内容保存到了stash中。所以,这时候需要用这个命令恢复现场:
git stash list: 显示当前stash列表里面保存了的工作区内容
git stash apply 以stash列表的第一个进行恢复
git stash apply stash@{1} 以stash列表的第二个进行恢复

需要注意的是,用apply恢复后在stash列表中还是存在之前保存的内容,需要用git stash drop删除

另一种更为方便的是在恢复的同时删除stash列表中的内容:
git stash pop

注意

如果在master分支修复bug之后需要把修复后的master内容同步到dev分支,则先转换到dev分支,再进行merge就可以了

feature分支(为新功能的开发创建的分支)

如果一个分支在合并之前就确认需要删除,也就是说这个分支的内容不再需要了,那么删除这个分支需要用到的命令为:
git branch -D branch_name
注意这里的D是大写,如果是合并过的分支需要删除,用的是小写的d

分支推送与抓取

推送:

git remote -v 查看远程仓库版本信息
首先用git remote查看远程仓库名,默认是origin
然后可以用git push origin branch_name
把分支推送到origin远程仓库中去

抓取:

git pull

如果推送失败,一般是先通过git pull 抓取远程仓库中的新版本,然后和本地仓库的相应分支合并,然后再推送到远程仓库中去。使用pull的时候需要先把本地仓库的分支和相应的远程仓库的分支进行关联,命令如下:
git branch –set-upstream branch-name origin/branch-name

一次把所有分支的更新抓取到本地仓库,可以用命令:git fetch origin, 如果在后面继续加上分支名,那么就和pull一样的作用

标签

标签相当于指针,是指向commit的指针,但是和分支管理中的HEAD指针不一样,标签是不可移动的,只能创建和删除

创建标签

git tag tag_name
这里是对最近一次commit打标签
如果要对之前的某此commit打标签,需要增加一个参数(commit id)
比如某次commit的id是6eabc123,那么可以用一下方式打标签:
git tag v1.0 6eabc123
标签也可以用注释,直接在后面加参数-m ”comment“即可

git tag v1.0 6eabc123 -m “this is a tag”

查看标签内容:
git show tag_name
比如
git show v1.0
git tag 查看所有标签

推送标签

git push origin 推送某个本地标签
git push origin –tags 推送本地所有标签
git tag -d 删除本地某个标签
git push origin :refs/tags/ 删除远程某个标签

注意:在删除远程标签之前需要先删除本地标签。

参与github开源项目

fork

fork他人的项目到自己的远程仓库中,然后clone到本地仓库进行开发,如果想要对方接受自己的代码,可以用pull request进行推送,如果对方接受,就成功推送。

pull request

想要对方接受自己的代码,首先就需要保证自己的代码能够被对方自动merge,也就是不能跟对方的主分支有冲突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章