• git简单使用总结


      Git是一种分布式版本控制系统。要想深刻理解Git的工作原理,需要理解理解Git的三个存放区域:本地工作目录、暂存区和仓库,也可以称为三棵树,不过在仓库这个地方又可以分为本地仓库和远程仓库

      

      Working Directory:本地工作目录(工作区)

      Stage(Index):暂存区

      Repository:仓库,仓库又分本地仓库和远程仓库

      Remote:远程仓库

      整个Git版本管理过程可以简单的理解为文件在三棵树上的管理过程:本地(本机)创建的文件,首先会存在本地工作目录,当使用git add命令后,会将文件同时保存到暂存区,在暂存区的文件使用git commit后,会将暂存区的文件提交到仓库,使用push从本地仓库提交到远程仓库。同样,仓库中的文件可以通过pull/clone/fetch/checkout等命令“检出”到任意一台计算机或者终端上。

    下面是Git命令的简单使用:

    1、安装后先进行配置,命令行中输入

      git config --global user.name "用户名"

      git config --global user.email "邮箱"

      

      配置完成后查看配置信息

      git config --list

    2、在需要提交的文件目录的地方初始化

      git init

    3、将当前文件夹下所有文件添加到暂存区

      git add .

      添加具体的文件到暂存区

      git add myfile.txt

    4、将当前添加到暂存区的文件恢复到最后一次提交的版本

      git reset HEAD

      将指定文件恢复到最后一次提交的版本

      git reset HEAD myfile.txt

    5、将暂存区的文件提交到仓库

      git commit -m "将暂存区的文件提交到仓库"

    6、查看状态

      git status

    7、当修改myfile.txt文件后,可以将修改后的文件重新提交,也可以将仓库中的版本检出覆盖被修改的文件

      (1)将暂存区的文件覆盖修改后的本地文件

        git checkout --myfile.txt

      (2)将修改后的文件myfile.txt添加到暂存区(此时还未提交)

        git add myfile.txt

      在该情况下有存在如下情况,本地文件myfile.txt又被修改,那么现在就会存在一个本地工作目录修改的文件myfile.txt和暂存区未被提交的文件myfile.txt,这时,如果git commit则表示将暂存区的文件直接提交到仓库,如果git add后在commit,表示先将本地文件跟新到暂存区,然后在将暂存区的文件提交到仓库。

      

    8、查看历史提交

      git log

      展示提交的历史记录,按照从近到远的提交commit顺序展示。

    9、回退版本命令

      git reset HEAD~  表示回退到HEAD上一个版本,~表示上一个版本(~~则表示HEAD的上上一个版本,以此类推,N个~表示HEAD的前N个版本,可以简写~N数字)

      (注:reset操作是将已经提交的版本回滚到上一个版本,即暂存区和本地仓库都会回退到上一个版本(无法影响远程仓库),但是工作区的版本信息不变,此时使用git status就会提示你需要将当前工作区的版本提交到暂存区)

      reset后可以添加的选项(默认 --mixed 表示回退的时候影响两棵树:暂存区和仓库)

        --soft(git reset --soft HEAD~)  

        作用:移动HEAD的指针,将其指向上一个快照(只影响一棵树即仓库,暂存区和工作目录不改变),该选项相当远撤销上一次commit提交,可理解为:撤销一次错误提交

        --hard  

        作用:    a、移动HEAD的指针,将其指向上一个快照

            b、将HEAD移动后的指向的快照回滚到暂存区

            c、将暂存区的文件还原到工作目录

        即:三棵树都会改变

      reset命令回滚总结:

        移动HEAD的指针(--soft),只影响仓库一棵树

        将快照回滚到暂存区域(--mixed,默认选项),影响了两个树

        将暂存区还原到工作目录(--hard),影响了三棵树

      回滚指定快照

        git reset 版本快照ID号  注:版本快照ID号git log中可以查看,在回滚的时候不需要全部输入,输入前6位即可

      回滚个别文件

        git reset 版本快照 文件名/路径  注:回滚个别文件,HEAD指针不会改变位置

      回滚不仅可以往后滚,也可以往前滚

        git reset 版本快照ID号

      git reset --soft HEAD~  撤销commit,不撤销git add,不删除工作空间改动代码,即只影响一棵树:本地仓库(commit后的区域)

      git reset --mixed HEAD~  撤销commit,撤销git add,不删除工作空间改动代码,即只影响两棵树:本地仓库(commit后的区域)和暂存区(add后的区域)

      git reset --hard HEAD~  撤销commit,撤销git add,并删除工作空间改动代码,影响三棵树:本地仓库(commit后的区域)、暂存区(add后的区域)和工作空间(目录)——>强行回退到上一个版本

      git reset --hard 版本快照ID  强行回退到指定的版本

    10、比较文件变化内容

      git diff  比较暂存区和工作目录

      git diff 快照ID1 快照ID2  比较两个历史快照(快照ID不需要全部输入,只需要输入前面几位就可以)

      git diff 快照ID  比较当前工作目录和Git仓库中的快照

      git diff HEAD  比较当前工作目录和最新版本内容

      git diff  --cached 快照ID  比较暂存区和Git仓库快照

      

    11、修改最后一次提交 

      执行带 --amend选项的commit提交命令,Git就会“更正”最近一次提交。

      git commit --amend

      git commit --amend -m "提交说明"

      上面两个命令会将暂存区中的文件提交到上一次的提交中,不会生成新的快照

    12、删除文件

      本地删除文件,如果要恢复文件使用命令 git checkout -- myfile.txt

      git rm myfile.txt   删除指定文件,该命令删除的只是工作目录和暂存区的文件,也就是取消跟踪,在下一次提交时不纳入版本管理,删除后仓库中并没有删除,要想仓库中也没有,只有回退到上一个版本,使用git reset --soft HEAD~

      情况一:如果工作区和暂存区中同一个文件内容不一致,这个时候使用git rm的时候就会出现问题,因为两个地方的同一个文件内容不同,这时要删除则需要使用强制删除git rm -f myfile.txt

      情况二:如果只想删除暂存区中的文件,这使用命令git rm --cached myfile.txt

    13、重命名文件

      git mv myfile.txt myNewNameFile.txt

    14、Git分支

      git branch 分支名  创建分支

      git log --decorate  日志显示提交的所有引用(包括分支、标签等信息)

      git checkout 分支名  将指针切换到指定分支名的分支上

      git log --decorate --oneline --graph --all  oneline表示一行精简化显示 graph表示图形化显示 all表示显示所有分支

      git checkout -b 分支名2  创建并切换到分支名2的分支,将创建和切换分支两步合为一步操作

    15、分支的合并和删除

      实际项目中分支情况一般比较复杂,如下:

      

      master:主分支,用于生产发布

      hotfix:bug修复分支,修改完bug就可以合并到master完成生产bug修复

      release(test):测试分支,测试通过了就可以合并到master分支进行上线

      develop:开发分支

      feature:功能开发分支

      

      git merge 分支名  合并分支,将指定分支名的分支合并到当前分支

      如果再合并的时候,两个分支的同一个文件都被修改了,那么在合并的时候就会发生冲突,需要手动编辑冲突文件,编辑完成保存后,在重新将编辑后的文件进行add、commit操作

      git branch -d 分支名  删除指定分支名的分支

      关于fetch和merge的使用

      git fetch remote  将远程仓库的所有变化更新到本地仓库

      git merge remote  将远程仓库的最新提交合并到本地的提交上(注:本地最好将所有文件都commit),并且自动commit

      如果再merge过程中出现冲突(远程仓库修改了A文件的第2-5行,本地仓库也修改了A文件的3-6行,那么其中第3-5行发生冲突),可以手动处理冲突后在commit,如果处理完冲突后,想放弃处理可以使用如下命令

      git merge --abort  放弃冲突的解决,回到merge冲突解决前的原始状态

      关于merge命令的详细解读可以参考:https://www.pianshen.com/article/4653192900/

    16、匿名分支

      git checkout 分支名  切换分支,将指针切换到指定分支名的分支上

      git checkout HEAD~  如果没有指定分支名,我只想切换到上一次提交的版本,使用该命令会创建匿名分支,如果此时在匿名分支上修改或者提交文件,就会将这些操作提交到匿名分支上,此时切换到其他分支的话,如果需要保留匿名分支的话,那么此时就需要给分支指定分支名(git branch 新分支名 快照ID号),否则的话该匿名分支就会被丢弃。

      如何寻找匿名分支?

      checkout有两种功能:

        (1)从仓库的历史快照或者暂存区中拷贝文件到工作目录 

          使用方法

          git checkout 指定快照ID 指定文件(如:git checkout HEAD~ myfile.txt)

          git checkout --指定文件(如:git checkout --myfile.txt)  没有指定快照ID的话,会将暂存区中的指定文件拷贝到工作目录并覆盖

          说明:上面操作指定文件最好加上--,因为不加--默认表示切换分支,如果没有与文件名相同的分支,也可以不加--

        (2)切换分支

           git checkout 分支名  将HEAD指针切换到指定分支名的分支上

      checkout和reset命令对比

      恢复文件对比

        相同点:两个命令都可以用于恢复文件,并且都不会修改HEAD指针位置

        区别:恢复文件,reset命令默认只是将指定文件恢复到暂存区(--mixed),而checkout命令是同事覆盖暂存区和工作目录文件

      恢复快照对比:如果用于恢复快照,reset命令是用来回到过去,会移动指针(--soft)->覆盖暂存区(--mixed)->覆盖工作目录(--hard)。checkout用于切换分支,实际上也是通过移动HEAD指针和覆盖暂存区和工作目录来实现的。

        区别:

        (1) 相对reset --hard来说,checkout命令更安全。因为checkout命令在切换分支前会检查一下当前的工作状态,如果不是“clean”的话,Git不会允许你checkout,而reset --hard命令直接覆盖所有数据;

        (2) reset命令会移动HEAD所在分支的指向(在同一分支上移动指针,可以理解为纵向移动),而checkout命令只会移动HEAD自身来执行另外一个分支(在不同的分支上移动指针,可以理解为横向移动)。

    17、远程仓库的管理

      git remote -v  显示所有远程仓库

      git fetch [remote]  下载远程仓库的所有变化到本地

      git clone [remote]  将远程仓库代码下载仓库

      git remote show [remote]  显示某一个远程仓库信息

      git remote add [shortname] [url]  增加某一个远程仓库并且命名

      git pull [remote] [branch]  将远程仓库文件下载到本地并且和branch分支合并

      git push [remote] [branch]  上传本地分支branch到远程仓库

      git push [remote] --force  前行将本地当前分支上传到远程仓库,忽略冲突(即使存在冲突,一样上传,会将本地修改覆盖远程)

      git push [remote] --all  将本地所有分支都上传到远程仓库

      说明只有涉及远程仓库的命令push/pull/fetch等才会在命令后添加远程仓库名字,如:git pull [remote] [branch]

      pull和fetch对比:

      相同点:pull和fetch都是跟新代码、文件。

      区别:

      pull表示从远程仓库orgin的master下载origin/master并且和本地分master支合并

      fetch表示从远程仓库orgin的master下载到本地orgin/master,但是并没有将本地origin/master与工作目录的master合并

       即:pull = fetch + merge(git pull [remote] [branch] = git fetch  [remote] [branch] + git merge [remote]/[branch] [branch]) 

       注:fetch可以理解为“取”,merge可以理解为“合并”,所以pull=取+合并

    在clone情况下,如果是Windows下,可能存在文件名过长的情况(Filename too long),执行

      先执行 git config --global core.longpaths true

      在执行 git clone [remote]

    18、选择提交合并

      git  cherry-pick commitid  有的时候,在develop分支开发,是大家公用的开发分支,但是只想合并自己提交的到master,那就要用cherry-pick。 

      步骤:

        1、git log查看自己提交的log,找到版本号,如最近的版本号是a1cc07fa c8e3316b  

        2、切换到想要合并的分支,如想把develop的合并到master,切换到master,执行 git  cherry-pick ee3c72,执行完之后,最后push。

    19、标签

      git tag  查看当前分支所有标签

      git tag v1.5.1  新增标签版本号 v1.5.1

      git push origin v1.5.1  将标签版本号 v1.5.1推送到远程origin上

    说明: 

      1、上面git命令中,使用--选项的表示输入的是选项的完整英文名,-选项表示输入的是选项英文名的缩写字母,如删除--delete=-d

      2、使用"."表示当前目录所有文件,如git checkout . 表示将暂存区所有文件恢复到工作目录

  • 相关阅读:
    C#根据IP地址和子网掩码计算广播地址
    关于ZIP大文件压缩
    JVM内存的设置
    Eclipse下内存溢出错误(OutOfMemoryError)
    实体化视图的使用心得(转)
    Java 调用cmd.exe命令
    select 操作选中添加、删除操作Javascript
    quartz定时任务时间设置
    手动安装 MyEclipse6.5 FindBugs
    App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.-解决办法
  • 原文地址:https://www.cnblogs.com/yanzige/p/12753954.html
Copyright © 2020-2023  润新知