美文网首页
git学习笔记

git学习笔记

作者: dancer4code | 来源:发表于2019-10-03 15:38 被阅读0次
    • git init
    • git add
    • git commit
    • git diff
    • git checkout
    • git status
    • git log
    • git reset
    • git reflog

    git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

    还记得如何丢弃工作区的修改吗?git checkout -- readme.txt
    git rm test.txt

    git remote add origin https://gitee.com/ztumj/test3.git
    git push -u origin master

    首先,我们创建dev分支,然后切换到dev分支:
    $ git checkout -b dev
    switched to a new branch 'dev'
    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev
    $ git checkout dev
    

    Switched to branch 'dev'
    然后,用git branch命令查看当前分支:

    $ git branch
    * dev
      master
    

    Git鼓励大量使用分支:

    查看分支:git branch

    创建分支:git branch <name>

    切换分支:git checkout <name>

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

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

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

    git log --graph --pretty=oneline --abbrev-commit

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
    git merge --no-ff -m "merge with no-ff" dev

    并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
    幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

    $ git stash
    太棒了,原计划两个小时的bug修复只花了5分钟!现在,是时候接着回到dev分支干活了!

    $ git checkout dev
    Switched to branch 'dev'

    $ git status
    On branch dev
    nothing to commit, working tree clean
    

    工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

    $ git stash list
    stash@{0}: WIP on dev: f52c633 add merge
    

    工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

    一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

    另一种方式是用git stash pop,恢复的同时把stash内容也删了:

    $ git stash pop

    在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。

    那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?

    有木有更简单的方法?

    有!

    同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

    为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:

    $ git branch
    * dev
      master
    $ git cherry-pick 4c805e2
    [master 1d4b803] fix bug 101
     1 file changed, 1 insertion(+), 1 deletion(-)
     
     
     
     $ git branch -d feature-vulcan
    error: The branch 'feature-vulcan' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
    

    销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。。

    现在我们强行删除:

    $ git branch -D feature-vulcan

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

    本地新建的分支如果不推送到远程,对其他人就是不可见的;

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

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

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

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

    rebase操作可以把本地未push的分叉提交历史整理成直线;

    rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

    然后,敲命令git tag <name>就可以打一个新标签:

    $ git tag v1.0
    可以用命令git tag查看所有标签:

    $ git tag
    v1.0
    

    如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

    方法是找到历史提交的commit id,然后打上就可以了:
    比方说要对add merge这次提交打标签,它对应的commit idf52c633,敲入命令:

    $ git tag v0.9 f52c633

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

    $ git show v0.9
    commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
    Author: Michael Liao <askxuefeng@gmail.com>
    Date:   Fri May 18 21:56:54 2018 +0800
    
        add merge
    
    diff --git a/readme.txt b/readme.txt
    
    

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

    $ git tag -a v0.1 -m "version 0.1 released" 1094adb
    

    如果标签打错了,也可以删除:

    $ git tag -d v0.1
    Deleted tag 'v0.1' (was f15b0dd)
    

    因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

    如果要推送某个标签到远程,使用命令git push origin <tagname>

    $ git push origin v1.0
    Total 0 (delta 0), reused 0 (delta 0)
    To github.com:michaelliao/learngit.git
     * [new tag]         v1.0 -> v1.0
    

    或者,一次性推送全部尚未推送到远程的本地标签:

    命令git push origin <tagname>可以推送一个本地标签;

    命令git push origin --tags可以推送全部未推送过的本地标签;

    命令git tag -d <tagname>可以删除一个本地标签;

    命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

    有的小伙伴又要问了,一个本地库能不能既关联GitHub,又关联码云呢?

    答案是肯定的,因为git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。

    使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。

    仍然以learngit本地库为例,我们先删除已关联的名为origin的远程库:

    git remote rm origin
    然后,先关联GitHub的远程库:

    git remote add github git@github.com:michaelliao/learngit.git
    注意,远程库的名称叫github,不叫origin了。

    接着,再关联码云的远程库:

    git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
    同样注意,远程库的名称叫gitee,不叫origin。

    现在,我们用git remote -v查看远程库信息,可以看到两个远程库:

    git remote -v
    gitee   git@gitee.com:liaoxuefeng/learngit.git (fetch)
    gitee   git@gitee.com:liaoxuefeng/learngit.git (push)
    github  git@github.com:michaelliao/learngit.git (fetch)
    github  git@github.com:michaelliao/learngit.git (push)
    

    如果要推送到GitHub,使用命令:

    git push github master
    如果要推送到码云,使用命令:

    git push gitee master
    这样一来,我们的本地库就可以同时与多个远程库互相同步:

    ┌─────────┐ ┌─────────┐
    │ GitHub  │ │  Gitee  │
    └─────────┘ └─────────┘
         ▲           ▲
         └─────┬─────┘
               │
        ┌─────────────┐
        │ Local Repo  │
        └─────────────┘
        
    

    有些时候,你想添加一个文件到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行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

    当然还有别的命令可以简写,很多人都用co表示checkoutci表示commitbr表示branch

    $ git config --global alias.co checkout
    $ git config --global alias.ci commit
    $ git config --global alias.br branch
    

    以后提交就可以简写成:

    $ git ci -m "bala bala bala..."
    

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

    在撤销修改一节中,我们知道,命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名:
    $ git config --global alias.unstage 'reset HEAD'
    当你敲入命令:

    $ git unstage test.py
    实际上Git执行的是:

    $ git reset HEAD test.py

    甚至还有人丧心病狂地把lg配置成了:

    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
    

    学习自
    Git教程
    易百教程/Git教程
    Git中文网-GitLab中文网

    相关文章

      网友评论

          本文标题:git学习笔记

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