• git复习总结


    基本命令

    内部运作

    生成公钥

    使用命令ssh-keygen生成,找到.ssh文件夹,即可看到公钥

    常见命令

    • git reset --soft HEAD^ 撤销一次commit到git add后的状态
    • git commit --amend 覆盖上一个commit的内容,修改后,上一个commit会被覆盖
    • git tag [ | ] 给某个commit或者分支所在的head加上tag,作用是作为一个milestone,该tab不随指针移动而变化
    • git describe [] 描述某个commit(缺省的话就是现在)最近的一个tag信息,输出最近的tag名字,间距的commit节点数,以及最近的一次提交的hash简化值

    分支管理

    • git branch -r 查看远程分支

    • git branch [branchName] [commitID] 在某处新建一个分支,命名为branchName

    • git branch -a查看所有分支,没有-a表示查看本地分支

    • git checkout -b myBranchName [remoteBranchToBeTracked] 创建新分支,并转到改分支[设置该分支的upStream]

    • git branch -u remoteBranchToBeTracked [localBranchName] 设置当前分支[或者指定的本地分支]的upStream名

    • git checkout dev(将head指针checkout到dev) 等价于 git switch dev

    • git merge dev将dev分支合并到master分支

    • git merge --no-ff 合并过程会被commit记录

    • git branch -d 删除分支

    • git branch -f master(分支名) [commitHash] 将某个分支的指针移动到指定的commit节点

    • git rebase [targetBranch] 两种情况,当前位于dev分支时候,target Branch为master,结果就是当前分支的所有commit移动到master上面;第二种是移动过后master分支位于dev后面,这是switch到master分支后再使用git rebase dev就可以让两个分支位于同一个位置。

    • git cherry-pick [commitId] 挑选分支上的commit节点,commit到当前分支(通常是主分支master)上。注意如果当前指针是在提交树的中间,那么这时候cherry-pick会自动创建新的分支。

    • git rebase -i startCommit[,endCommit] 从startCommit开始对后面的commit进行合并(减少快照次数,总代码不变),前开后闭的区间,如果没有endCommit会让你选择如何对后面的commit进行合并(--interactive)

    指针移动

    git checkout HEAD^ 移动头指针到上一个commit(相对移动)
    git checkout HEAD^^ 移动头指针到上2个commit(相对移动)
    git checkout HEAD~3 移动头指针到上3个commit(相对移动)
    git checkout [commitHash] 绝对移动到某个节点

    远程交互

    基本命令
    git fetch 从远程仓库获取最新commit并更新本地的远程仓库指针(origin/master)

    本地的远程仓库指针(origin/master)与本地仓库有什么区别?
    origin/master是一个分支名,它的目标是与远程仓库同步。当本地commit的时候,master分支向前走,但是origin/master分支还停留在原处。origin/master当我与远程仓库交互的时候才会变化,例如我执行git pull,git fetch,git push等等。

    remote branches reflect the state of the remote repositories since you last talked to those remotes. git fetch is the way you talk to these remotes! origin/master分支通常与远程仓库同步,当执行git fetch后,origin/master与远程同步(多了几个commit),此时本地仓库(HEAD)还未与本地的origin/master同步,执行 git merge后才进行合并。git pull = git fetch; git merge

    git fetch, however, does not change anything about your local state. It will not update your master branch or change anything about how your file system looks right now.So at the end of the day, you can think of running git fetch as a download step.

    通常,远程有几个分支,本地就有几个对应的远程分支指针,如下图,一个git fetch命令就可以将两个分支和远程进行同步:

    git fetch origin remoteBranch : localBranch将某个远程分支fetch到本地分支,并保持本地的origin/remoteBranch不变,如果本地localBranch不存在则创建。如下图:

    git pull 等价于git fetch;git merge; git pull --rebase等价于git fetch;git rebase
    git push [仓库名] [分支名字] 例子: git push origin master 相当于git push; git push origin dev将本地新建的分支推送到远端仓库

    关于git push: 最合适push的场景就是,当前分支与远程分支同名(都是master)然后当前的HEAD又在远程HEAD之后(多了几个commit),这时候push没有一点问题。当不是同一个分支的时候,会在远程创建相应的分支

    git push [remoteName localBranch] 将本地的分支推送到远程的分支,例如:git push origin foo
    git push [remoteName localCommit:RemoteBranchName] 将本地的特定节点(特定节点之前的所有节点)推送到远程某个分支(不存在则创建)例子git push origin master^:foo
    git remote -v 查看远程库的信息
    git remote 查看远程仓库名(默认名称是origin,如果有另一个比如gitee则会有另一个名字)
    git status 查看那些文件被修改(untracked表示从没有被添加过的文件)
    git diff 文件名,查看该文件变化

    git remote add [originName] < address >
    例子git remote add origin2(远程库的名字) https://123456/521qq.github.com
    git push -u [originName] master
    例子git push -u origin2 master 将当前master分支和远程master分支关联起来, 以后就可以直接用git push/git pull简写啦

    常见问题

    1. git pullgit fetch区别:
      git pull会自动合并,但有冲突并不会覆盖而是让你进行手动merge。弊端是本地目录会在未经确认下更新,如果使用fetch,可以先git diff [fetch来的分支名]查看下更改,确认后再merge。 不过正常情况直接git pull比较方便而且也没什么问题。

    2. git reset --mixed --hard --soft区别:
      作用范围不一样

    3. git rebase 与git merge的区别
      git merge简单的说就是合并两个分支并生成一个新的提交

      工作原理就是:git 会自动根据两个分支的共同祖先即 (3.added merge.txt file)这个 commit 和两个分支的最新提交即 (6.added hello.txt file) 和 (5.added test.txt file) 进行一个三方合并,然后将合并中修改的内容生成一个新的 commit,即图二的(7.Merge branch ‘develop’)。


      git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前的提交cherry-pick到目标分支上,然后将在原始分支上的已提交的commit删除.

    工作原理:
    在执行git rebase develop之前,HEAD在(6.added hello.txt file)处,当执行rebase操作时,git 会从两个分支的共同祖先 (3.added merge.txt file)开始提取 当前分支(此时是master分支)上的修改,即 (6.added hello.txt file)这个commit,再将 master 分支指向 目标分支的最新提交(此时是develop分支)即(5.added test.txt file) 处,然后将刚刚提取的修改应用到这个最新提交后面。如果提取的修改有多个,那git将依次应用到最新的提交后面,如下两图所示,图四为初始状态,图五为执行rebase后的状态。

    还有一点说明的是,在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,如果此时运行git pull -r,也就是git pull --rebase,相当于git fetch + git rebase

    常用实例

    1. 正常开发
      分支只是一个特殊的commit,commit不占用多少空间,只是一个提交记录,所以可以多次使用,每增加一个功能都可以先拉一个分支,然后写完后merge或者rebase到主分支上面去。如果觉得功能不好,就丢掉这个分支,切回主分支再次创建新的分支。

    2.恢复
    git log查看commit提交历史记录 或
    git reflog查看命令历史

    如果没有push过,那就可以用reset命令回退,如果已经push到远程仓库,那么就一定要使用revert命令(相当于commit到了之前),然后再次push到远端,就可以回退到之前的状态

    git reset [commitId | HEAD^] 返回到某个状态(本地仓库使用,如果是远程仓库返回,则应用到revert命令)
    git revert [commitId | HEAD] ⚠️注意使用revert命令与reset的不同:reset是返回到某个节点,后面的节点丢弃;revert是提交一个新的节点,这个节点的内容是[commitId | HEAD] 提交之前的所有内容。换句话说,reset后面跟的commit ID是你想要恢复到的节点,而revert后面的commit ID是你想要舍弃的节点,该节点之前的节点才是你想要恢复到的节点。
    git checkout --filename 曾经添加到版本库的文件可以恢复

    1. 强制命令:
      git push -f 强制覆盖。但是这是一个非常非常危险的操作,如果你 git push -f 了,没有人会知道你到底修改了什么,只建议在自己独有的分支上如此操作,一定一定要谨慎使用

    2. 修改上上次的commit内容

    git rebase HEAD^^ # 调换上次与上上次的commit顺序
    git commit --amend # 对上上次的commit后内容进行修改
    git rebase HEAD^^ # 调换上上次与上次的commit顺序
    git rebase caption master # 
    
  • 相关阅读:
    web api 设置允许跨域,并设置预检请求时间
    T4模板
    DDD模式
    Vue watch用法
    第三章--第五节:集合
    简单的Python API爬虫与数据分析教程--目录
    第三章--第四节:字典
    第三章--第三节(补充):列表排序
    汇总张小龙在知乎上的问答
    第三章--第三节:列表
  • 原文地址:https://www.cnblogs.com/lyzz1314/p/14732189.html
Copyright © 2020-2023  润新知