Git的大体工作原理与常用命令

3 篇文章 0 订阅

git工作原理

基本概念

git有三个区域:工作区、暂存区(称为stage或index)、版本库(Repository)

要使用git将文件保存到版本库中,需要先使用git add <filename>命令将文件从工作区添加到暂存区(stage),然后使用git commit -m "<提交声明>"命令将文件从暂存区提交到版本库中当前所在分支(默认是master分支)。

git三个区域的关系

Remote Repository Stage Workspace fetch/clone push reset commit checkout add Remote Repository Stage Workspace

git 命令学习

  • 创建版本库:git init

    本命令会在当前文件夹下创建一个git版本库

  • 添加文件到暂存区:git add <filename>

    将要提交的文件添加到暂存区

  • 提交:git commit -m "message"

    将暂存区中的文件提交到版本库

    添加到暂存区中的文件才会被提交!!

  • 查看工作区状态:git status

    此命令可以列出:

    1. 当前目录所有还没有被git管理的文件
    2. 被git管理且被修改但还未提交(git commit)的文件
  • 查看某一文件相较于最近一次提交的改动:git diff <filename>

    只跟当前分支的最后一次提交记录比较(若改变分支,则文件也随之改变,故没法比较)

    git diff后面不带参数,则会列出所有已提交文件的改动

    可以跟某个版本比较:git diff HEAD^^ <filename>

  • 查看提交日志:git log

    显示从最近到最远的记录(若超过一屏,则会分屏显示,按q退出,按Enter输出下一屏)

    使用git log --graph可查看分支图

  • 查看历史命令:git reflog

    此命令可实现查看曾经使用过的命令和commit id

  • 撤销变更git reset 相对位置或commit_id <filename>

    将暂存区的内容回退到相对位置或者提交ID的位置,而不改变工作区的文件,若想将工作区内容也回退,则需要使用git checkout filename;若想直接将工作区和暂存区的内容都回退,则可使用git reset --hard HEAD~num.

    必须注意:

    若目录下某些文件未add和commit,则执行git reset --hard <版本>命令对于这些文件来说是毁灭性的!!

    若出现上述情况,如果文件曾经添加到暂存区,可以通过git fsck --lost-found命令实现找回,具体操作:[关于git reset --hard这个命令的惨痛教训](https://blog.csdn.net/qq_31608451/article/details/78342365?ops_request_misc=&request_id=&biz_id=102&utm_term=git reset --hard &utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-78342365)

  • 创建新分支git branch name

    删除分支:git branch -d name

    查看当前存在的分支:git branch

    强制转移分支git branch -f name 哈希值or相对位置

    • 此命令不可撤销远程分支,只对本地分支起作用

    删除一个某有合并过的分支,可以通过git branch -D name强行删除

  • 跳转分支或回退文件git checkout <name>

    默认跳转分支,若没有改分支,则将同名文件在工作区的内容回退为暂存区的内容

    若想回退的文件与分支重名,则可以通过git checkout -- filename命令回退

    若想创建一个新分支并跳转过去,则可以在git checkout后面添加参数-b,如下:

    git checkout -b <branch-name>

  • 跳转分支:git switch name

    跳转到name分支,与git checkout name命令一样,只不过checkout命令有跳转分支和回退文件功能,不方便;故添加switch命令

    添加参数-c可实现创建并跳转分支:

    git switch -c name

  • 删除文件:git rm filename

    将文件从工作区和暂存区中删除,版本库中还存在.此时还可以通过git reset HEAD回退。若想连带将版本库中的数据也删除,则继续执行一次git commit命令即可。注:删除后无法回退

  • 创建远程连接:git remote add 别名 链接地址

    例:创建一个链接到https://gitee.com/figght/learn.git网址的远程连接,连接的名字是:orign

    git remote add origin https://gitee.com/figght/learn.git

    可使用git remote -v查看已创建的远程连接

    可使用git remote remove 名字删除远程连接

  • 将本地版本库推送到远程库:git push 远程连接名字 本地分支

    git push origin master

    若远程库是空库,只需要加上参数-u

    git push -u origin master

  • 拉取分支并合并:git pull

    一般语法为:git pull 远程主机名 远程分支名:本地分支名

    例如:git pull origin master:dev表示将远程主机origin上的master分支拉取下来并合并到本地master分支中

    若想将拉取的分支与当前本地分支合并,则冒号(:)后的内容可以省略:git pull origin master

    若想直接使用git pull拉取并合并分支,则需要建立追踪关系(tracking)。比如:

    • 克隆git clone时,会默认将本地分支与远程主机的同名分支建立追踪关系。
    • 可通过命令git branch --set-upstream-to=远程主机名/远程分支名 本地分支名手动建立追踪关系,此时使用git pull可直接拉取并合并对应的分支。

    git pull origin master相当于git fetch origin+git merge origin/master

  • 克隆远程库:git clone ssh地址

    git clone git@gitee.com:figght/learn_clone.git

  • 合并分支

    1. git merge <name>

      本命令将name分支合并到当前指针指向的分支

      若在创建新分支后原分支又提交过,则合并时会产生冲突,需要手动解决

      普通合并是直接将分支指向待合并分支,若删除分支,会丢掉分支信息,即看不出来曾经有分支被合并;使用--no-ff参数会在合并时生成新的提交,可以看出来曾经有分支被合并。

      普通合并禁用Fast Forward模式
      会丢掉分支信息不会丢掉分支信息
      看不出来有过分支合并痕迹可以看出有分支合并痕迹
    2. git rebase <name>

      将name分支转移到主分支master之后

  • 保存工作现场:git stash

    使用场景:正在使用dev分支开发时,突然想用修复master分支上的bug(即在master分支上创建新的bug分支),但是当前dev分支上正在开发的工作还没做完,还不能提交。那么就可以使用git stash命令保存工作现场,然后跳转到master修改bug.开发完成之后回到dev分支恢复现场即可。

    恢复现场:git stash apply或:git stash pop;区别是:

    git stash applygit stash pop
    恢复现场,但不会删除stash内容;若需要删除stash内容,使用命令git stash drop恢复现场的同时也会将stash内容删除

    当多次stash后,恢复现场时可以先试用git stash list查看,然后指定要恢复的stash现场。例如:

    git stash apply/pop stash@{0}

    查看stash: git stash list

  • 将特定的提交复制到当前分支:git cherry-pick 提交ID

  • 创建标签:git tag tag-name <commit-id>

    若指定commit-id,则默认添加标签到HEAD指向的提交记录。

    使用git tag查看当前分支中的所有标签

    使用git tag tag-name -m "message-for-tag" <commit-id>可为指定commit-id的提交打上带有注释的标签。若想为已有标签添加注释,只需要在tag-name前面加上参数-a即可。

    使用git log可查看到各个标签。

    使用git show tag-name可看到位于标签处的提交的详细信息。

    使用git tag -d tag-name删除标签。

    标签不会自动推送到远端,若想推送标签到远端,需要手动推送

    git push <romote-name> tag-name:推送某个标签到远端

    git push <remote-name> --tags:推送所有未推送到远端的标签到远端

    删除已经推送到远端的标签:

    • 首先,删除本地标签:git tag -d tag-name
    • 然后,删除远端标签:git push <remote-name> :refs/tags/tag-name
      • git revert <name>

回退到当前HEAD指向的记录的前一个记录,(相当于将HEAD指向的记录撤销,并提交有关之前的记录

杂项

  • 设置git bash启动默认路径

    找到git bash的快捷方式,打开属性,将目标栏最后的--cd-to-home删掉,并将起始位置栏改成要设置的路径。

  • 相对位置:

    ^:上一条

    ~数字:以上多少条

  • 在GitHub上见到好的项目想要克隆下来推送时,需要先Fork到自己的仓库,然后再克隆自己仓库的项目到本地,不然直接克隆别人的项目会导致没有权限推送修改。

  • 若发现自己Fork的项目有bug并且修复了的话,可以通过pull request给官方贡献代码(不一定接受)。

  • 若当前工程中只有部分文件需要添加到版本库,其他文件不添加,需要在工程目录(与.git文件夹同一级的目录)下创建一个.gitignore文件。

    .gitignore忽略规则:

    格式说明
    #string注释
    .abc忽略所有后缀为".abc"的文件
    !.bcd不忽略后缀为".bcd"的文件
    /abc只忽略项目根目录下的abc文件,不包括项目下文件夹的同名文件
    dir/忽略dir文件夹下所有文件

    若在添加.gitignore文件前已经addcommit过,则规则不会生效,此时需要清空本地缓存:

    git rm -r --cached .  #-r:递归
    git add .
    git commit -m "update file .gitignore"
    

    也可以直接删除.git文件夹,然后再次执行git init,然后添加、提交

    下面是keil5编写51程序时的.gitignore文件内容:

    #取消忽略.c、.h和.A51文件
    !*.c
    !*.h
    !*.A51
    # #忽略.gitignore文件
    # .gitignore
    #忽略这两个文件夹下的所有文件
    Listings/
    Objects/
    #忽略全部后缀为这些的文件
    *.lst
    *.m51
    *.obj
    *.zxp14
    *.uvproj
    *.uvopt
    *.__i
    *.htm
    *.lnp
    *.hex
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值