从零开始学git 速成

一、创建版本库

1、创建空目录


$ pwd 用于显示当前目录


2、初始化

通过$ git  init  命令,将目录变成Git可管理的版本库



3、添加

通过$ git add 命令告诉Git,将文件添加到暂存区(文件如果没有 add  到暂存区,就无法实现 commit 到版本库)



4、提交

通过$ git commit命令告诉Git,将文件提交到版本库


-m 后面的是本次提交的说明


二、版本控制及修改删除

1、版本状态

在 README.txt 文件上稍作修改,$ git status 可以让我们时刻把握版本库当前的状态,下面代码告诉我们 README.txt 被修改过了,但还没有准备提交的修改



$ git diff 可以让我们知道具体修改过的内容



知道修改过的内容,确认无误后通过命令 $ git add 将文件添加到暂存区,通过命令 $ git commit 提交到版本库


2、版本回退

将 README.txt 文件再做修改,然后提交(目前 README.txt 文件提交了3个版本)


通过 $ git log 可以看到由近到远的日志



也可以加上 --pretty=oneline 参数将每个版本的信息集合在一行上



在Git中,当前版本用 HEAD 表示,上一个版本就是 HEAD^ ,上上个版本就是 HEAD^^ ,往上第100个版本可以写作 HEAD~100 ,现在把当前版本"append GPL"会退到"add distributed",可以用上 $ git reset --HARD^ 



可以通过 cat 查看当前版本的内容,看看是否已回退到"add distributed"的版本



另外,我们可以通过 $ git log 查看现在版本库的状态



很明显,最新的那个版本的内容已经不见了,如果要回到最新版本的话,可以通过以下两种方法实现:

(1)只要之前的命令窗口没关闭,就可以顺着往前找,找到“append GPL” 的 commit id :f7086aa......使用 $ git reset --hard f7086aa 命令就可以回到该版本了



(2)如果已经关闭命令窗口或电脑,也不用担心,可以通过 $ git reflog 查看每一次命令的记录,再使用 $ git reset --hard f7086aa 命令就可以回到该版本了



3、撤销修改

分为3种场景:

(1)场景1:当改乱了工作区的内容,想直接丢弃工作区的修改时,用 $ git checkout -- file 命令可以回到上一个版本的状态

修改前:


改乱后:


使用 $ git checkout -- file 命令后:



(2)场景2:当不但改乱了工作区,还添加到暂存区时,想丢弃修改,此时需要先执行命令 $ git reset HEAD file 将暂存区的修改撤销掉,就会回到场景1,再执行场景1的命令

用 $ git status 查看一下状态:



$ git reset 既可以回退版本,也可以将暂存区的修改回退到工作区,当我们使用 HEAD 时,表示最新的版本。



此时,再使用场景1的命令 $ git checkout -- file 操作就OK了


(3)场景3:当将改乱的版本内容提交到版本库,且还未将本地版本库推送到远程时,可以使用版本回退命令 $ git reset hard -- xxxxxxx 回到上一版本。


4、删除文件

删除文件有两种方式:一是在文件夹中直接删掉,而是通过 rm 删除。



当你删掉一些文件后,工作库和版本库就会不一致,$ git status 命令会告诉你哪些文件被删掉了。



现在面临两种情况:一是确定要删除,那就使用 $ git rm 命令删掉,并且 $ git commit:



二是删错了,可以通过 $ git checkout -- LICENSE.txt 命令将版本库的版本替换工作库的版本。


三、远程仓库

创建本地Git仓库后,又想在GitHub上创建Git仓库,实现两个仓库远程同步,这样一来,GitHub上的仓库既可以当备份,又可以让其他人通过该仓库来协作。

1、添加远程库

首先登录GitHub,点击右上角的“+”号,选择“New repository”,


然后填写title,勾选initialize...,点击create repository,完成创建。


目前GitHub上的learn仓库是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以从本地已有的仓库关联到该仓库,然后将本地仓库的内容推送到GitHub仓库中。

现在,我们在本地的learngit仓库下运行命令:$ git remote add origin [email protected]:Vince-Tse/learn.git

注意:将Vince-Tse换成你自己的账号


下一步就可以将本地仓库的内容推送到GitHub上了:$ git push -u  origin master

由于远程库是空的,第一次推送时需要加上 -u ,这样Git不但会将本地master的内容推送到远程master上,还会把本地master和远程master关联起来,在以后的推送或拉取就可以简化命令,如:$ git push origin master


2、从远程库克隆

使用 $ git clone [email protected]:Vince-Tse/learn.git 命令可以从远程库克隆版本

Vince-Tse/learn.git 换成自己的账号及版本库


四、分支管理

1、创建与合并分支

当我们创建新分支如 dev 时,Git新建了一个指针称为 dev ,指向 master 相同的提交,再把 HEAD 指向 dev ,此时当前分支就在 dev 上。

首先,我们创建  dev 分支,然后切换到 dev 分支:



使用$ git checkout -b dev 命令,可以一次性创建新分支并切换到新分支上,其效果等同于使用了 $ git branch dev ,接着使用 $ git checkout dev 命令:



然后使用 $ git branch 可以查看当前分支,当前分支前面有个 * 标记:



在dev分支工作区完成工作后,进行提交:



此时,切换回master分支  :



现在,把dev分支上的工作成果合并到 master 分支上:



合并完成后,就可以放心地删除dev分支了:



删除后,使用$ git branch 命令查看发现,现在只剩下master分支了。



小结:

查看分支 $ git branch

创建分支 $ git branch <name>

切换分支 $ git checkout <name>

创建和切换分支 $ git checkout -b <name>

合并分支 $ git merge <name>

删除分支 $ git branch -d <name>


2、处理冲突

当master 分支 与 其它分支如feature 都有各自的提交时,Git 无法使用快速合并,只能试图把各自的修改合并起来,但这种合并可能有冲突:



上图中,Git告诉我们,README.txt文件存在冲突,需手动解决冲突后再进行提交;$ git status 也可以告诉我们冲突的文件:



修改完毕之后,再进行提交,使用 $ git log -graph 加参数可以看到分支的合并情况:



最后,删除feature分支:



3、分支管理策略

通常,如果有可能,分支合并时Git会采用 Fast forward 模式,但这种模式下,删掉分支后,会丢掉分支信息;

如果强制禁用Fast forward 模式(使用命令 $ git merge --no-ff -m "***" <name>),Git在merge时会生成一个新的commit ,这样在分支历史中可以看到分支信息,如下:


注意:--no-ff 表示禁用Fast forward 模式,因为本次合并要创建一个新的commit,所以用 -m 参数,把 commit 描述写进去。


合并后,可以使用$ git log 查看分支历史:



4、bug 分支

当在dev分支上的工作还未能提交,而master分支上又有bug急需处理时,可以先把dev分支的当前工作现场“储藏”起来:



修改完bug后,现在可以查看之前的工作现场位置:



工作现场还在,但是Git把stash内容存在某个地方了,可以通过以下两个方法进行恢复:

方法1:用 $ git stash apply 恢复,但是恢复后,stash内容并不删除,需要通过$ git stash drop 删除;

方法2:用 $ git stash pop 恢复,恢复的同时也删除stash内容。


5、feature分支

开发一个新feature,最好新建一个新分支;

如果要强行删除一个未合并过的feature分支,使用命令 $ git branch -D <name>


6、多人协作

(1)推送分支

master分支是主分支,因此时刻需要与远程同步,推送主分支 $ git push origin master;

dev分支是开发分支,团队上所有成员都在上面工作,因此也需要与远程同步 $ git push origin dev;


(2)抓取分支

当你的同事在远程库克隆时 $ git clone [email protected]:user-name/path.name;

默认情况下,他只能看到本地的master分支,如果他要在dev分支上工作,那他就必须创建远程origin的dev分支到本地,命令为 $ git checkout -b dev origin/dev 

当你同事的最新提交与你试图推送的提交有冲突时,解决方法如下:先用 $ git pull 把最新的提交从origin/dev抓取下来,在本地合并,解决冲突,再推送。


(3)工作模式

a.首先使用 $ git push origin branch-name 推送自己的内容;

b.如果推送失败,则说明远程分支比你本地的更新,需要用 $ git pull 试图合并;

c.如果合并有冲突,则解决冲突,在本地提交;

d.没有冲突或解决冲突后,使用 $ git push origin branch-name 就能推送成功。

如果git pull 提示“no tracking infomation”,则表示本地分支与远程分支的链接关系没有创建,使用命令 $ git branch --set-upstream branch-name origin/branch-name 即可。


小结:

a.查看远程库信息,使用 $ git remote -v;

b.本地创建的分支,如果没推送到远程库,对他人就是不可见的;

c.在本地推送分支,使用 $ git push origin branch-name;如果推送失败,先用 $ gti pull抓取远程的新提交;

d.在本地创建和远程分支对应的分支,使用 $ git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

e.创建本地和远程分支的关联,使用 $ git branch --set-upstream branch-name origin/branch-name;

f.从远程抓取分支使用 $ git pull,如果有冲突,则先处理冲突。


五、标签管理

1、创建标签

首先,切换到需要打标签的分支上,使用 $ git tag <name> 命令即可打上标签,可通过 $ git tag 查看所有标签:



如果之前的内容忘记打标签,可通过查找历史的commit id 补上标签:



比如,现在要对 append GPL 打算标签,对应的 id 是 f7086aa ,敲入命令:



还可以创建带有说明的标签,-a 指定标签名,-m 指定说明文字:



$ git show <tagname>可查看标签信息:



2、操作标签

删除本地标签:



推送一个标签到远程仓库:



将尚未推送的所有标签推送到远程仓库:



从远程仓库删掉一个标签,需要先删除本地标签,在删除远程标签:



小结:

a.使用 $ git tag <tagname> 创建标签

b.使用 $ git tag 查看所有的标签

c.使用 $ git show <tagname>查看标签信息

d.使用 $ git tag -a <tagname> -m "..."  commit id 指定标签信息

e.使用 $ git tag -s <tagname> -m "..." 可以用GPG签名标签

f.推送一个本地标签到远程 $ git push origin <tagname>

g.将尚未推送的所有标签到远程 $ git push origin --tags

h.删除本地标签 $ git tag -d <tagname>

i.删除远程标签,需要先删除本地标签,再删除远程标签 $ git push origin <tagname>


六、使用Github

在GitHub上,可以任意fork开源仓库,再克隆到本地仓库,即拥有了fork后的仓库的读写权限,可以推送pull request 给官方仓库贡献代码。


七、自定义Git

1、忽略特殊文件

在Git工作区的根目录下创建 .gitignore 文件,将要忽略的文件添加进去,Git 会自动忽略,然后提交 .gitignore 文件就完成了;

如果添加某文件到Git时,发现已被忽略了,但又很想添加的时候可以使用 -f 参数强制添加: $ git add -f app.class

当你发现 .gitignore 有问题,想查看具体的规则时,可以这样用 : $ git check-ignore -v app.class

.gitignore 文件本身需要放在版本库里,而且可以对 .gitignore 做版本管理


2、配置别名

git 命令中有些单词不好记,可以采取简写,只需加入一行代码,如:

用 st 代替 status:$ git config --global alias.st status ,以后在这台电脑下的所有Git库中, st 就可以代替 status 了;

用 co 代替 checkout : $ git config --global alias.co checkout 同上;

用 ci 代替 commit : $ git config --global alias.ci commit 同上;

用 br 代替 branch : $ git config --global alias.br branch 同上;

八、问题汇总

1、Git 提示fatal: remote origin already exists 错误

      解决办法:a.先删除远程库  $ git rm origin

                        b.再添加远程库,name 换成自己的  $ git remote add origin master [email protected]:name/name

2、failed to push some refs to git

      解决方法:a.先执行以下命令进行代码合并 $ git pull --rebase origin master

b.再执行命令 $ git push -u origin master 即可将代码上传至GitHub


文章系本人学习廖雪峰老师的git教程后总结所得!

猜你喜欢

转载自blog.csdn.net/yisimo/article/details/74784312