发表于: 2017-04-20 16:31:42

2 723


通过阮一峰的git日志,学习到了git的知识点并做以下笔记:

所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

一、命令行

安装完成后:

$ git config --global user.name "Your Name"

$ git config --global user.email "email@example.com"

1.先创建再通过命令行添加

cd 路径

创建一个版本库:  mkdir learngit

初始化一个Git仓库,使用git init命令。

使用我们指定目录作为Git仓库git init filename

添加文件到Git仓库,分两步:

第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;

第二步,使用命令git commit,完成。

$ git add  文件名   //添加

$ git commit -m "描述修改的内容"  //提交

2.git status 查看仓库状态(比如是否有需要提交的,是否有修改..)

  git diff 文件名   查看文件修改前后内容,可以知道自己最后一次到底修改了什么

然后再添加提交

(-----执行 git diff 来查看执行 git status 的结果的详细信息。

git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。

尚未缓存的改动:git diff

查看已缓存的改动: git diff --cached

查看已缓存的与未缓存的所有改动:git diff HEAD

显示摘要而非整个 diff:git diff --stat----)

3.git log 查看历史修改记录,默认显示三条  

 可以试试加上--pretty=oneline参数:显示比较简洁

bad2e7203ae87f9301c1bbd0556fe1cad73560f7 add GRL    //bad2e7203ae87f9301c1bbd0556fe1cad73560f7为版本号

39b3571d6c10c9908c12c1534c9c8434bf625236 add distributed

9cd8afbd48a568a2f0fee4916e10e5f089c6e774 wrote a readme file

4.版本退回:git reset --hard HEAD^

上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

回到上一个版本之后,使用git log 上一个版本就已经没有了,在还没有关闭控制台时

可以用($ git reset --hard 版本号前几位  )就可以找回

当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:

5. cat 文件名   查看文件内容

6.撤销修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节

7.删除文件  (rm 文件名)

7-1:如果真的要删除就确认删除并提交 git rm filename

7-2:如果是不小心删除:($ git checkout -- 文件名)

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

8.远程仓库:

   8-1. 首先注册一个GitHub账号,

   8-2. 由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

        第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

       $ git-keygen -t rsa -C "1214840825@qq.com"  需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即

        第二步:登录GitHub,进入settings(设置) - SHH and GPG keys(添加公钥)

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

         远程仓库创建完毕

   8-3 添加远程库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作

   8-3-1 第一步:登录GitHub,找到+列表下的New repository,创建git库

        $ git remote add origin git@github.com:michaelliao/learngit.git  //关联远程库

         (git remote rm origin   --- 用来解除关联)

        然后把本地库的所有内容推送到远程库上:

        $ git push -u origin master  //推送 master 分支

        把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:

       从现在起,只要本地作了提交,就可以通过命令:

       $ git push origin master

 9.上面讲的是现有本地仓库,后有远程仓库,如何关联远程库;现在我们从零开发,那么最好的方式是先创建远程库,

然后,从远程库克隆

   9-1: 第一步:先登录GitHub,创建一个库

        第二步:远程库创建好之后,用git clone 克隆一个本地库 git clone git@github.com:pcxweb/mywarehouse.git

10.分支管理

    10-1:创建和合并分支:

    Git鼓励大量使用分支:

     查看分支:git branch

     创建分支:git branch <name>

     切换分支:git checkout <name>

     创建+切换分支:git checkout -b <name>

     合并某分支到当前分支:git merge <name>

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

     10-2 解决冲突(在创建的分支和master分支上同时提交修改地方相同但内容不同的文件),

合并之后需删除分支  

git log --graph --pretty=oneline --abbrev-commit(查看合并情况)

     10-3 分支管理策略

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

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

下面我们实战一下--no-ff方式的git merge:

准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:

$ git merge --no-ff -m "merge with no-ff" dev

Merge made by the 'recursive' strategy.

 readme.txt |    1 +

 1 file changed, 1 insertion(+)

  11.bug分支:

     git stash (存储功能)当正在某个分支(dev)工作,还没法提交,但是突然接到一个

修复一个代号101的bug任务,需要暂停正进行的工作时,可以先存储,重新创建分支issue-101修复bug

修复完成后删除该分支,然后继续回到之前工作分支(dev),用git stash list 查看之前工作现场

git把stash内容存在某个地方,需要进行恢复:

       两种方法:1.用git stash apply,该方法恢复后,stash内容不删除,用git stash drop删除

                2.git stash pop  恢复同时删除stash内容)

  12.feature 分支

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

        如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除

  13 多人协作

       模拟多人协作:可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆:

       同一台电脑: git clone git@github.com:pcxweb/learngit.git

       必须创建远程origin的dev分支到本地: git checkout -b dev origin/dev(前提必须库有dev分支)

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

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

查看远程库信息:git remote   或  git remote -v(更详细)

        推送分支:git push origin master/(其他分支)

        抓取分支:当有小伙伴在你之前修改了同一个分支同一个文件并提交,你提交的时候就会提示冲突

于是你需要 用git pull 把最新的提交从origin/dev抓取下来,然后合并,解决冲突,再推送,

在git pull之前需要指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:

(git branch --set-upstream dev origin/dev),再git pull最后推送

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

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

     14. 标签管理:

         git log --pretty=oneline --abbrev-commit(查看所有修改版本号)

        14-1. 创建标签 $ git tag v1.0(标签名)注:在commit提交之后打标签

               给之前版本添加标签  git tag v0.9 6224937(版本号)      

              查看标签:git tag (标签安装字母顺序列出,而不是时间顺序)

               git show v0.9 查看标签信息

        14-2. 创建带有签名的标签:用-a指定标签名,-m指定说明文字:

              git tag -a v0.1 -m "version 0.1 released" 3628164

        14-3.  还可以通过-s用私钥签名一个标签git tag -s v0.2 -m "signed version 0.2 released" fec145a

签名采用PGP签名,因此,必须首先安装gpg(GnuPG)如果没有找到gpg,或者没有gpg密钥对,就会报错:

如果报错,请参考GnuPG帮助文档配置Key。

用命令git show <tagname>可以看到PGP签名信息:用PGP签名的标签是不可伪造的,因为可以验证PGP签名。验证签名的方法比较复杂

         14-4. 操作标签:

         删除标签:git tag -d v0.1  创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

         推送标签到远程,使用命令git push origin <tagname>:

         一次性推送全部尚未推送到远程的本地标签:git push origin --tags

        

        删除已经推送到远程库的标签:$ git tag -d v0.9

                                  $ git push origin :refs/tags/v0.9

 15.使用GitHub:

   可以访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:git clone git@github.com:michaelliao/bootstrap.git

   一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限,你将不能推送修改。

 16.自定义Git  :

       git配置颜色:$ git config --global color.ui true

 17.忽略特殊文件:

     (在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。)

      你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:

$ git add App.class

The following paths are ignored by one of your .gitignore files:

App.class

Use -f if you really want to add them.

如果你确实想添加该文件,可以用-f强制添加到Git:

$ git add -f App.class

或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:

$ git check-ignore -v App.class

.gitignore:3:*.class    App.class

Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

18.配置别名:  $ git config --global alias.st status   =》git status = git st

               $ git config --global alias.co checkout => co =checkout

               $ git config --global alias.ci commit => ci = commit

               $ git config --global alias.br branch => br = branch

--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。

               $ git config --global alias.last 'log -1' =>git last =git log -1(查看最后一次提交)

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

              

每个仓库的Git配置文件都放在.git/config文件中:$ cat .git/config 

当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中: cat .gitconfig  //用户主目录

19.搭建git服务器:

20.在GitHub的修改更新在本地:

  第一步:git fetch origin  更新

  第二步:git merge origin/master 将更新同步到本地

21删除远程仓库

删除远程仓库你可以使用命令:

git remote rm [别名]

实例

$ git remote -v

origin git@github.com:tianqixin/runoob-git-test.git (fetch)

origin git@github.com:tianqixin/runoob-git-test.git (push)

# 添加仓库 origin2

$ git remote add origin2 git@github.com:tianqixin/runoob-git-test.git

$ git remote -v

origin git@github.com:tianqixin/runoob-git-test.git (fetch)

origin git@github.com:tianqixin/runoob-git-test.git (push)

origin2 git@github.com:tianqixin/runoob-git-test.git (fetch)

origin2 git@github.com:tianqixin/runoob-git-test.git (push)

# 删除仓库 origin2

$ git remote rm origin2

$ git remote -v

origin git@github.com:tianqixin/runoob-git-test.git (fetch)

origin git@github.com:tianqixin/runoob-git-test.git (push)

http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html



返回列表 返回列表
评论

    分享到