Git 学习

作者: 墨罚 | 来源:发表于2019-08-25 18:45 被阅读0次

    一、基本操作

    • 将当前目录初始化一个git仓库
      git init
    • 将文件快照放入暂存区域
      git add 文件
    • 提交更新,找到暂存区域的文件,将快照永久存储到git仓库
      git commit -m "提交信息,建议写有意义的详细信息,方便从历史记录中找到改动记录"
      可以多次git add 不同文件,commit一次将暂存区所有修改提交
    • 查看仓库当前状态
      git status
      下面的命令输出告诉我们,demo.txt被修改过,但未提交
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
            modified:   demo.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
    
    • 查看修改的内容
      git diff 文件
    • 查看提交日志
      git log
      如果看的眼花缭乱,可以加上--pretty=oneline
    • 回退到某一版本
      git reset --hard 某一版本 回退到往上100个版本
      HEAD表示当前版本
      HEAD^表示上一个版本
      HEAD^^表示上上一个版本
      HEAD~100表示往上100个版本
    • 回到之前最新版本
      git reset --hard 版本id id越长越好,不然容易找到多个版本号
      1. 在命令行窗口还没关闭的情况下,找到那一版本的commit id(一串十六进制)
      2. Git提供了一个命令记录你的每一次命令
        git reflog
        可以从中找到对应commit id
    • 撤销修改
      git checkout -- 文件
      回退到最近一次git commitgit add时的状态
      命令中--很重要,没有就变成“切换到另一个分支”
    • 撤销暂存区的文件,重新放回工作区
      git reset HEAD 文件
    • 删除文件
      git rm 文件
      • 第一种情况 git rm并且 git commit 将删除版本库的文件。
      • 第二种情况git checkout -- 文件 将被删除的文件恢复到最新版本。

    二、远程仓库

    • 创建SSH Key
      ssh-keygen -t rsa -C "邮箱" 会在用户主目录下生成.ssh目录
      id_rsa私钥,不可泄露
      id_rsa.pub公钥,可以告诉任何人
    • 在GitLab上添加SSH密钥(公钥)
    • 在GitLab中创建仓库,并复制仓库的SSH格式的URL(注意不是地址栏的URL)
    添加远程仓库
    • 关联远程库,在本地仓库下运行命令
      git remote add origin 仓库URL 这里是GitLab仓库的URL
      其中origin是远程库的名字,可以修改。
    • 将本地库内容推送到远程库
      git push -u 远程库名称 master
        用git push命令,实际上是把当前分支master推送到远程。
        由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
        从现在起,只要本地作了提交,就可以通过命令git push 远程库名称 master推送到GitLab
    从远程库克隆
      git clone 远程仓库的URL  
      //这样本地仓库就已经将远程仓库项目克隆下来了。
    

    三、分支管理

      因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    • 创建并切换分支
      git checkout -b 分支
      git checkout 命令加上 -b表示创建并切换,相当于一下两条命令
        git branch 分支
        git checkout 分支
    
    • 查看当前分支
      git branch

    • 切换分支
      git checkout 分支

    • 合并指定分支到当前分支
      git merge 指定分支

    • 删除分支
      git branch -d 分支

    • 解决冲突

    修改dev分支后

    $ git checkout master
    Switched to branch 'master'
    Your branch is ahead of 'origin/master' by 1 commit.
      (use "git push" to publish your local commits)
    //修改分支后,从分支切换到master时,Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。
    

    如果此时再修改master分支内容,合并时会提示冲突

    $ git merge feature1
    Auto-merging demo.txt
    CONFLICT (content): Merge conflict in demo.txt
    Automatic merge failed; fix conflicts and then commit the result.
    //Git告诉我们,demo.txt文件存在冲突,必须手动解决冲突后再提交。
    

    git status也可以告诉我们冲突的文件
    在文件内容中Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
    将冲突的内容统一,解决冲突内容后重新提交即可。

    • 查看分支合并情况
      git log --graph --pretty=oneline --abbrev-commit
      git log --graph查看分支合并图
    分支管理策略

      通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
    如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

    • 禁用Fast forward模式,创建分支
      git merge --no-ff -m "详细合并信息" dev
    BUG分支

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

    • 将当前工作现场“储藏”起来,等以后恢复现场继续工作
      git stash
      现在用git status查看工作区,工作区就是干净的(除非没有被Git管理的文件)
    • 查看“储藏”的工作现场
      git stash list
    • 恢复最近一次“储藏”的工作现场
      git stash apply
      恢复指定工作现场,通过git stash list查看工作现场的序号,将(stash@{序号})追加到命令后面
      注意,序号越靠后,说明储藏的时间越长
      这样恢复后,stash内容并不会删除,需要手动删除
    • 删除“储藏”的工作现场
      git stash drop
    • 恢复并删除“储藏”的工作现场
      git stash pop
    • master分支出现bug,说明dev同样也存在,Git专门提供了命令,让我们复制一个特定的提交到当前分支
      git cherry-pick 特定的提交id
    Feature分支

      软件开发中,总有无穷无尽的新的功能要不断添加进来。
      添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
      如果在feature分支还没有合并前,需要取消这个功能,删除时会销毁失败,需要使用大写的-D参数强制删除。
       git branch -D 分支

    多人协作

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

    • 查看远程库的信息
      git remote -v -v表示详细信息
    • 推送分支
      git push 远程库名称 本地分支名称
    • 抓取分支
      git clone 远程仓库的URL 默认只能看到本地的master分支
      如果要在dev分支上开发,就必须创建远程origin的dev分支到本地
      git checkout -b dev origin/dev 创建并且还dev分支,并将远程库origin/dev 弄下来
      如果最新提交和你推送的提交有冲突,先用git pull把最新提交抓下来,然后在本地合并,解决冲突,再提交。
    //git pull 失败
    $ git pull
    There is no tracking information for the current branch.
    Please specify which branch you want to merge with.
    See git-pull(1) for details.
    
        git pull <remote> <branch>
    
    If you wish to set tracking information for this branch you can do so with:
    
        git branch --set-upstream-to=origin/<branch> dev
    //原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
    
    • 设置本地分支dev与远程分支origin/dev的链接
      git branch --set-upstream-to=origin/dev dev

    • 多人协作工作模式
      尽量将冲突在本地解决

    1. pull远程库内容到本地先进行合并
    2. 如合并冲突,则解决冲突
    3. 如没有冲突或解决后,再commit 并push到远程库

    相关文章

      网友评论

        本文标题:Git 学习

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