一文了解Git日常利用

打印 上一主题 下一主题

主题 795|帖子 795|积分 2385

Git 基本利用

        在基本利用之前,须要熟悉一下Git的工作区、暂存区和版本库的概念
                工作区: 开发环境中的目次,当前的改动未被记录到版本控制中。
                暂存区:暂时存储区域,包罗了即将被提交到版本库中的文件快照,在提交之前可以选择性的将工作区中的改动添加到暂存区。
                版本库:包罗该项目标所有版本历史记录。通常我们的代码库会维护在远程,所以版本库分为本地版本库和远程版本库。
        让我们来看下,这几个区是怎么举行交互的:

        从上图中我们可以看到
        1、工作区 -> 暂存区
              利用git add 命令将文件添加到暂存区。                        
  1. // 添加某一文件名为fileName的文件
  2. git add fileName
  3. // 添加所有改动的文件
  4. git add .
复制代码
       2、暂存区->本地目次树(本地版本库)
             利用git commit将暂存区中的所有文件添加到本地目次树中
  1. git commit -m "本次提交说明"
复制代码
        3、本地目次树->远程版本库
              利用git push将本地版本库的代码同步到远程代码库
  1. git push origin branch-name
复制代码
      4、远程版本库->本地版本库
              如果是第一次从远程代码库拉代码到本地,通常本地是没有版本库的,所以我们利用git clone 将远程代码库克隆到本地;如果不是第一次(已经和远程仓库绑定)那么可以利用git push 大概git fetch + git merge将代码拉下来,并同步到本地版本库和工作区。
  1. // 同步远程版本库并合并到当前工作区
  2. git pull origin branch-name
  3. // 同步远程版本库
  4. git fetch origin branch-name
  5. // 合并代码
  6. git merge origin/branch-name
复制代码
Git 创建仓库

1、新起一个项目

        如果是新起一个项目标话,须要搞定本地仓库和远程托管,假设利用github作为远程托管代码的平台的话,可以先在github上创建一个仓库,如许远程托管部门就完成了,本地仓库的创建有多种方式,这里先容两种环境:
        a、 不须要通过工具结构化创建模板代码: 那么直接git clone 命令将远程仓库down下来就行。
  1. // git clone <Git仓库> <本地目录名称>
  2. git clone git://github.com/****/demo.git GitDemo
  3. // 如果不指定本地目录名称,那么会默认使用demo作为目录名称
  4. git clone git://github.com/****/demo.git
复制代码
然后在该目次中操纵即可。
        b、须要通过工具结构话创建模板代码(比如在Android Studio中创建了一个项目,Idea 会自动生成很多模版代码文件):这个时候就须要自行和远程仓库关联。
  1. // 如果工具没有帮忙生成git仓库,那需要自行生产,如果自动生成,则省略这步
  2. // 进入到项目的目录
  3. git init
  4. // 需要和远程仓库关联,才能推送到远程
  5. git remote add <地址>
  6. // 然后将所有文件添加到本地仓库
  7. // 也就是 一套组合拳
  8. git add .
  9. git commit -m "init"
  10. git push
复制代码
2、在旧项目上迭代

        比如说,作为新人参与已经迭代了的项目时,这种环境比较简朴,只须要将远程仓库git clone下来就行,然后就能开始开发了~
  1. git clone <地址> <目录>
复制代码
Git 分支管理

1、创建新分支及切换

  1. // 创建一个 new-branch 分支
  2. git branch new-branch
  3. // 切换到 new-branch 分支
  4. git checkout new-branch
  5. // 切换分支还有一种方法  推荐 (因为git checkout负载比较重,容易混)
  6. git switch new-branch
复制代码
2、删除分支

  1. git branch -d new-branch
复制代码
3、分支归并

        在协同合作的过程中,在开发分支完成开发后须要归并到公共分支,大概公共分支有新的提交,须要归并到开发分支,这些都涉及到分支的归并,git提供了两种归并分支的能力,开发者可以根据自己的需求去选择不同的方法举行分支归并。
git merge

        将其他分支的改动点归并后在当前分支上生成一个最新的提交记录(额外的),这种方法可以比较清晰的看出各个分支间的交互,改动的来源;不好的地方是会使的整个提交记录比较杂。
  1. // 当前分支 current 和 公共分支 main
  2. // 现在将当前分支的代码改动合并到公共分支
  3. // 首先切换到公共分支
  4. git switch main
  5. // merge
  6. git merge current
  7. // 执行上述代码后,会生成一个新的节点 c5在main分支上
复制代码
归并前:

执行上述代码,归并后

从main分支合到current分支同理,只不外脚色转换了。
git rebase

        当执行rebase时,git会从两个分支的共同祖先开始提取待变基分支上的修改,然后将待变基分支指向基分支的最新提交,末了将刚才提取的修改应用到基分支的最新提交的背面。
(这里大家大概会对待变基分支、和基分支的概念有疑问)
        假设我们现在在current分支上举行了部门修改,然后此时公共分支main有新的改动,我们须要将main分支的改动归并到current分支上,那么current分支是待变基分支,main是分支
  
  1. // 把main的改动合并到current
  2. // git rebase main
复制代码
归并前:
​归并后:

归并后发现current改动前的基点变成了main中最新的节点,如许做可以使得整个提交记录是一条直线,但是他的缺点也很明显,就是无法溯源改动,所以通常在开发过程中,会约定不能在公共分支举行rebase,否则会导致公共分支的提交记录被修改,使得记录不清晰。
所以不能在公共分支举行rebase 不能在公共分支举行rebase 不能在公共分支举行rebase!!!
Git 提交记录管理

1、HEAD

        HEAD会指向一个提交记录,当它指向这个提交记录时,你所做的操纵都是基于该提交记录举行的,默认环境下,HEAD总是指向当前分支最新的提交记录,但是在某些环境下,我们可以分离HEAD使其指向我们须要的提交记录,以完成须要举行的操纵。
  1. // 假设当前提交记录的引用为 c1
  2. // 那么我们将HEAD分离出来
  3. git checkout c1
复制代码

那现在要将其指向c0,该怎么做呢?其实也很简朴,只须要知道c0的引用的哈希值就行
  1. git checkout c0
复制代码
如果我们不知道某个提交记录的哈希值(固然可以通过git log看到提交记录的哈希值),但是可以很直观的看到它的相对位置呢?这就须要学习到几个特别符号啦~
2、相对引用 ~ 和 ^

        相对引用不同于通过哈希值的方式举行指向改变,它可以通过当前位置举行相对移动。


  •  利用 ^ 向上移动 1 个提交记录
  •  利用 ~N 向上移动 N 个提交记录
 

向上移动一个提交记录
  1. git checkout HEAD^
复制代码

再向上移动2个提交记录
  1. git checkout HEAD~2
复制代码

3、撤销提交

       当提交的改动不须要时,要举行回滚的操纵,git也提供了多种方法举行代码的回滚。
git reset

        重置当前分支到特定提交(该提交的内容不会被重置),会更改历史提交记录,实用于未提交到远程版本库的修改。
  1. // 首先需要知道要回滚到具体提交记录的哈希值(当然也可以使用相对引用)
  2. git reset c2
  3. // 相对引用法,两者效果相同
  4. git reset HEAD~2
复制代码

 reset 一共有四种回滚模式, 默认利用的是Mixed模式举行的回滚。


  • Mixed: 重置 HEAD 到指定的提交,暂存区重置,但工作目次保持稳定。
  • soft: 只重置 HEAD 到指定的提交,暂存区和工作目次保持稳定。
  • hard: 重置 HEAD 到指定的提交,暂存区和工作目次都重置。
  • keep: 重置 HEAD 到指定的提交,暂存区重置,工作目次仅重置提交的代码,其余的保持稳定。
  1. // soft
  2. git reset <提交记录哈希> --soft
  3. // mixed
  4. git reset <提交记录哈希> --mixed
  5. // hard
  6. git reset <提交记录哈希> --hard
  7. // keep
  8. git reset <提交记录哈希> --keep
复制代码
git revert

     撤销一系列提交,不会修改历史记录,但是会生成一个新的提交记录(该提交记录的内容会剔除咱们须要撤销的内容),这个利用于已经提交到远程仓库的修改。并且和reset不同的是,在举行回滚时,回滚的内容也包罗我们指定的提交记录中包罗的内容(也就是回滚到该记录的上一级)
  1. // 回滚到c2
  2. git revert c2
  3. // 使用相对引用
  4. git revert HEAD~2
复制代码

4、自由修改提交树

git cherry-pick

        如果想要复制一些提交记录到当前地点位置(HEAD)下的话,可以利用git cherry-pick命令,被选中的提交记录会依次被添加到当前位置的背面。
  1. // 需要知道提交记录的哈希值
  2. git cherry-pick c2 c4
复制代码
 修改前

修改后:

git rebase -i

        交互式 git rebase用法,可以通过相对引用的方式修改提交记录, 再利用这个命令后会出现一个文本编辑,通过改变每个提交前的pick选择来改变改记录的保留大概是否和其他记录归并
  1. git rebase -i HEAD~3
复制代码

输入命令后进入到下面的文本编辑页面

将feat 15移除的话,须要将Feat: 15 前的pick改为drop即可
修改完成后输入 :wq 即可退出编辑
完成操纵后的效果如下:

else case

case: 举行reset、revert等操纵时,操纵失误导致须要的记录丢失,怎么找回?
         可以通过git reflog 检察历史操纵记录,然后找到回归丢失前的哈希值,然后通过git reset 将丢失的记录找回。
  1. git reset <需要恢复的哈希值>
复制代码

强烈推荐 Learn Git Branching




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表