美文网首页
Git管理学习

Git管理学习

作者: 蒲小帅丶 | 来源:发表于2017-11-22 15:37 被阅读0次
    感谢廖雪峰老师的分享。传送门

    1.利用git创建目录

    在本地创建版本库,在合适的地方,这是在E盘下。pwd 命令用于显示当前的目录(如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。) image.png

    2.升级成git管理仓库

    通过 git init 把此目录编程git管理仓库
    瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

    如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。 image.png
    此时你可以在生成的目录下新建自己的文件了。

    3.文件的提交

    首先可以用git status 查看状态,在主分支。用 git add 名字添加文件

    image.png 本地修改了文件内容,用git status 查看,提示readme.txt被修改过了,但还没有准备提交的修改。git diff 查看修改的内容 image.png 再进行文件的提交,此时提交到暂存区。 image.png 在Git中,我们用git log命令查看: image.png 可以查看提交记录。嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数: image.png 需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。 image.png 想要恢复版本怎么办?

    4.版本的回滚

    只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本 image.png

    版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

    现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办? image.png 前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    管理修改-----修改 add ,修改 提交 == 修改 add 修改 add 提交

    5.撤销修改

    git checkout -- readme.txt 撤销

    git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。 image.png

    6.删除文件

    一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:rm test.txt检查状态的时候发现: image.png 现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit: image.png 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
    $ git checkout -- tet.txt

    命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

    7.远程控制

    由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置所以要添加shh
    ssh-keygen -t rsa -C "youremail@example.com"
    github上创建新的仓库之后:

    image.png
    如果遇到提示: image.png 移除,重新添加
    image.png 下一步,就可以把本地库的所有内容推送到远程库上: image.png 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
    由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
    从现在起,只要本地作了提交,就可以通过命令:
    git push origin master
    修改了本地,添加到暂存区,提交,推送到远程 image.png SSH警告
    当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
    The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
    这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
    Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
    Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
    这个警告只会出现一次,后面的操作就不会有任何警告了。
    如果你实在担心有人冒充GitHub服务器,输入yes前可以对照
    GitHub的RSA Key的指纹信息 是否与SSH连接给出的一致。
    =================
    要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin master第一次推送master分支的所内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

    8:版本克隆

    在电脑其他地方创建一个文件夹(目的让clone的learngit不与本地的重复) ,在gitbash中进入该目录 image.png 输入指令,克隆我们learngit。此时在github上是有这个仓库的。 image.png 本地E盘下就克隆好了
    总结:要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

    9.分支管理

    创建和合并分支 image.png image.png image.png

    实战=============================================

    首先我们创建了dev分支,然后切换到分支dev分支 image.png git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
    git branch dev
    git checkout dev
    9.1查看分支 image.png
    当前分支会标记一个*号,然后对文件进行了修改,添加文字XXXX。提交 image.png 此时 图例就像下面一样,主分支中没有文字XXXX,因为还在分支中。 image.png ,然后我们切换到主分支可以查看 image.png 本地readme.txt中确实没有新加的文字XXXX。接下来我们合并分支
    9.2合并分支 image.png
    git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。 image.png

    删除后,查看branch,就只剩下master分支了

    9.3总结

    查看分支:git branch
    创建分支:git branch <name>
    切换分支:git checkout <name>
    创建+切换分支:git checkout -b <name>
    合并某分支到当前分支:git merge <name>
    删除分支:git branch -d <name>

    10.解决冲突 image.png

    创建了分支dev1,添加了内容,切换到主分支也添加了内容。图例就像这样子 image.png
    合并会产生冲突,必须手动解决冲突后再提交 image.png 用 git status 可查看
    image.png 在文件中我们也能看见
    image.png 在手动解决了冲突之后,改成下面的样子 image.png
    然后在 添加到暂存区 ,并提交 image.png 此时的关系图就是如下 image.png 最后删除分支dev1。 image.png 这样子就解决了冲突。
    最后可以推送到远程 image.png 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
    用git log --graph命令可以看到分支合并图。

    11.分子策略管理

    合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 image.png

    如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

    请注意--no-ff参数,表示禁用Fast forward: image.png 总结:=============================
    在实际开发中,我们应该按照几个基本原则进行分支管理:

    首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

    所以,团队合作的分支看起来就像这样: image.png

    12.bug分支

    软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
    并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
    幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
    $ git stash

    12.1首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支: image.png image.png

    bug解决完了,就继续工作
    工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
    $ git stash list
    stash@{0}: WIP on dev: 6224937 add merge
    工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    另一种方式是用git stash pop,恢复的同时把stash内容也删了:
    删除之后,用 git stash list 就看不到内容了
    你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
    $ git stash apply stash@{0

    小结

    开发一个新feature,最好新建一个分支;
    如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

    13.多人协助工作

    当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

    要查看远程库的信息,用git remote: image.png
    13.1推送分支

    推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
    $ git push origin master 推送到远程主分支
    $ git push origin dev 推送到远程dev分支
    但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
    ● master分支是主分支,因此要时刻与远程同步;
    ● dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
    ● bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
    ● feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
    总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!

    13.2抓取分支

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin branch-name推送自己的修改;
    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    3. 如果合并有冲突,则解决冲突,并在本地提交;
    4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
      如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
      这就是多人协作的工作模式,一旦熟悉了,就非常简单。
    13.3标签管理

    标签也是版本库的一个快照。
    请把上周一的那个版本打包发布,commit号是6a5819e...不好找
    请把上周一的那个版本打包发布,版本号是v1.2,这样子根据v1.2就可以绑定了

    在Git中打标签非常简单,首先,切换到需要打标签的分支上 image.png 但是如果过了时间忘记打标签了,怎么办?
    方法是找到历史提交的commit id
    eg:

    $ git log --pretty=oneline --abbrev-commit
    6a5819e merged bug fix 101
    cc17032 fix bug 101
    7825a50 merge with no-ff
    6224937 add merge
    59bc1cb conflict fixed
    400b400 & simple
    75a857c AND simple
    fec145a branch test
    d17efd8 remove test.txt
    比方说要对add merge这次提交打标签,它对应的commit id是6224937,敲入命令:
    git tag v0.9 6224937

    注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息: image.png
    小结
    ● 命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    ● git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    ● git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;
    ● 命令git tag可以查看所有标签。
    13.4操作标签
    删除标签 image.png 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使用命令git push origin <tagname> image.png 一次性推送全部的本地的标签$ git push origin --tags
    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除eg: image.png

    从远程删除
    git push origin :refs/tags/v1.0

    要看看是否真的从远程库删除了标签,可以登陆GitHub查看。 image.png 小结
    ● 命令git push origin <tagname>可以推送一个本地标签;
    ● 命令git push origin --tags可以推送全部未推送过的本地标签;
    ● 命令git tag -d <tagname>可以删除一个本地标签;
    ● 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
    13.5github相关

    小结
    ● 在GitHub上,可以任意Fork开源仓库;
    ● 自己拥有Fork后的仓库的读写权限;
    ● 可以推送pull request给官方仓库来贡献代码。

    13.6忽略特殊文件

    git add -f App.class 强制添加
    你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
    $ git check-ignore -v App.class
    总结:
    ● 忽略某些文件时,需要编写.gitignore;
    ● .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
    配置别名,让命令更简洁
    比如:git config --global alias.st status
    git st === git status
    配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中
    git服务器配置

    相关文章

      网友评论

          本文标题:Git管理学习

          本文链接:https://www.haomeiwen.com/subject/lznnvxtx.html