美文网首页
git常用命令

git常用命令

作者: 马丁路德东 | 来源:发表于2018-08-20 17:40 被阅读0次

    教程源自 廖雪峰老师的博客,在此表示感谢,知识的先行者。

    设置全局的用户信息

    一般的开发环境是建立在windows上的:所以记录win的使用方法(其他系统大同小异)

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

    1.常用命令
    最开始应是初始化

    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
    

    添加git监管的文件(添加到暂存区)

    git add <filePath>
    

    提交到本地仓库(一般来说每次提交都要添加 -m 参数,已标注此次修改的内容)

    $ git commit -m "wrote a readme file"
    

    查看当前git的状态(那些文件更改,那些文件添加)

    $ git status
    

    输出(因项目各异)

    On branch master
    Your branch is up to date with 'origin/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:   target/m2e-wtp/web-resources/META-INF/maven/huahai.com/SmartWeb/pom.properties
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
    
            .classpath
            .idea/
            .project
            .settings/
    

    查看上一次修改的具体内容

    git diff
    

    显示的格式正是Unix通用的diff格式。例如:

    --- a/.classpath
    +++ b/.classpath
    @@ -33,7 +33,7 @@
                            <attribute name="owner.project.facets" value="jst.web"/>
                    </attributes>
            </classpathentry>
    -       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java">
    +       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre1.8.0_171">^M
                    <attributes>
                            <attribute name="owner.project.facets" value="java"/>
                    </attributes>
    diff --git a/.project b/.project
    index 4ef05cf..e71384a 100644
    --- a/.project
    +++ b/.project
    @@ -25,8 +25,19 @@
                            <arguments>
                            </arguments>
                    </buildCommand>
    +               <buildCommand>^M
    +                       <name>org.springframework.ide.eclipse.core.springbuilder</name>^M
    +                       <arguments>^M
    +                       </arguments>^M
    +               </buildCommand>^M
    +               <buildCommand>^M
    +                       <name>org.springframework.ide.eclipse.boot.validation.springbootbuilder</name>^M
    +                       <arguments>^M
    +                       </arguments>^M
    +               </buildCommand>^M
            </buildSpec>
            <natures>
    +               <nature>org.springframework.ide.eclipse.core.springnature</nature>^M
                    <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
                    <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
                    <nature>org.eclipse.jdt.core.javanature</nature>
    diff --git a/Dev/ReadMe.txt b/Dev/ReadMe.txt
    index bb984fb..33ddc88 100644
    
    

    查看git 仓库的提交历史

    $ git log
    

    输出,例如(每一次提交都会生成一个唯一标识的id,此id在同一时空中只有一个):

    commit 69322bc293e87e2910fa45896ea3f9ed15fd3a36 (HEAD -> master, origin/master)
    Author: webapp <2205553696@qq.com>
    Date:   Fri Aug 17 18:11:15 2018 +0800
    
        修改请求路径的统计
    
    commit 1e3ade674254661f0033636e928a0d97fe3a3d33
    Author: webapp <2205553696@qq.com>
    Date:   Fri Aug 17 15:41:08 2018 +0800
    
        添加相关注释,解决javadoc报错
    
    commit 61f285cf1caed8fc33081921aa1296de449c2eaa
    Author: webapp <2205553696@qq.com>
    Date:   Fri Aug 17 11:24:38 2018 +0800
    
        天级数据和小时级数据的小区级excel数据改为下载全部数据,拦截器添加请求路径的
    单独拦截
    
    commit d275ed92f9e8faa3a45e6a346d0526c937c7259c
    Author: webapp <2205553696@qq.com>
    Date:   Thu Aug 16 17:35:06 2018 +0800
    
    :...skipping...
    
    

    回撤到上一次提交的状态(HEAD类似是一个指针,他一般情况下执行最新的一次提交)

    $ git reset --hard HEAD^
    

    想要回到更早之前的某个版本,除了使用HEAD,进行版本回退。还可以直接输入commit的id,id可以用过git log查看

    $ git reset --hard <ID>
    

    查看之前的的命令操作(用git reflog查看命令历史,以便确定要回到未来的哪个版本)

    $ git reflog
    

    放弃工作区的修改(暂未add 的前提下)(git checkout -- file) --很重要,没有--,就变成了“切换到另一个分支”的命令git checkout为切换分支的命令

    git checkout -- readme.txt
    

    如果错误的文件已经 add 进入了暂存区。那么git reset HEAD <file> ,可以把暂存区的修改撤销掉(unstage),重新放回工作区

    $ git reset HEAD readme.txt
    

    删除文件并提交

    $ git rm test.txt
    rm 'test.txt'
    
    $ git commit -m "remove test.txt"
    

    如果删错,则:(同样注意--)

    $ git checkout -- test.txt
    

    到此就是git最常用的命令,SVN也有相同的功能,那git的优势又在哪里?

    优势: Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。

    1. 为git的远程仓库添加SHHkey
    $ ssh-keygen -t rsa -C "youremail@example.com"
    

    如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

    1. 登陆GitHub,打开“Account settings”,“SSH Keys”页面:
      然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
    2. 在github添加远程仓库(最后调整到SHH页面)

    4.本地绑定远程仓库(根据github的提示切换成你自己的命令)

    $ git remote add origin git@github.com:michaelliao/learngit.git
    

    5.推送本地到远程(把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,第一次提交会有安全提示,选择yes就行

    $ git push -u origin master
    

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

    $ git push origin master
    

    本地克隆远程仓库

    $ git clone git@github.com:michaelliao/gitskills.git
    

    优势:其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

    创建dev分支(一般情况下,我们开发不会直接在master主分支上开发,每个开发组员,第一回在自己的dev分支上进行开发,master只进行最稳定版本的发布。)

    首先,我们创建dev分支,然后切换到dev分支:

    $ git checkout -b dev
    

    切换分支 (git checkout <name>)

    git checkout dev
    

    加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'
    

    查看当前分支(git branch命令会列出所有分支,当前分支前面会标一个*号。)

    $ git branch
    

    合并分支(下面的操作意味着,将dev分支合并到当前分支上。)

    $ git merge dev
    

    合并完成后,就可以放心地删除dev分支了:

    $ git branch -d dev
    

    但是git合并分支并非都能成功,假如你要合并的分支都在原节点的同一个文件上进行了修改,那git就不知道以谁为准了。这时就会因为文件冲突而合并失败
    这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:

    $ git merge feature1
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:

    $ git status
    On branch master
    Your branch is ahead of 'origin/master' by 2 commits.
      (use "git push" to publish your local commits)
    
    You have unmerged paths.
      (fix conflicts and run "git commit")
      (use "git merge --abort" to abort the merge)
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
    
        both modified:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    

    Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
    例如:

    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes of files.
    <<<<<<< HEAD
    Creating a new branch is quick & simple.
    =======
    Creating a new branch is quick AND simple.
    >>>>>>> feature1
    

    可以使用带参数的git log 查看分支合并的情况(用git log --graph命令可以看到分支合并图。)

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

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

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

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

    然后查看合并日志

    $ git log --graph --pretty=oneline --abbrev-commit
    *   e1e9c68 (HEAD -> master) merge with no-ff
    |\  
    | * f52c633 (dev) add merge
    |/  
    *   cf810e4 conflict fixed
    ...
    

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

    git还提供了stash的功能,可以先把当前的的工作现场保存起来。(当代码写了一半,不方便直接commit的时候可以使用此功能)

    $ git stash
    Saved working directory and index state WIP on dev: f52c633 add merge
    

    查看储藏列表

    $ git stash list
    

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

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

    另一种方式是用git stash pop,恢复的同时把stash内容也删了:
    恢复指定的stash 最后为stash的标识,可以通过git stash list 查看

    $ git stash apply stash@{0}
    

    分支策略

    在实际开发中,我们应该按照几个基本原则进行分支管理:
    1.首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    2.那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
    所以,团队合作的分支看起来就像这样:

    分支合并图

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

    $ git branch -D feature-vulcan
    Deleted branch feature-vulcan (was 287773e).
    

    相关文章

      网友评论

          本文标题:git常用命令

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