赞
踩
一、创建版本库
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 git@github.com: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 git@github.com: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 git@github.com: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 git@github.com:name/name
2、failed to push some refs to git
解决方法:a.先执行以下命令进行代码合并 $ git pull --rebase origin master
b.再执行命令 $ git push -u origin master 即可将代码上传至GitHub
文章系本人学习廖雪峰老师的git教程后总结所得!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。