Python社区  »  Git

学习笔记-git常用命令记录

玖月晴空 • 1 周前 • 31 次点击  
阅读 100

学习笔记-git常用命令记录

本篇出自一个使用 git的小白,哈哈,也推荐给各位小白们,我们一起进步喽!大神们不要觉得太简单哦,小白们正在努力朝着你们跑来,一二三四,一二三四..... 好了,回归主题,写这篇文章的初衷是因为:自己最近发现对git的掌握真的是太浅了,犹如蜻蜓点水,也借此机会从小白的角度来看git,并对git做一个初步探索性的了解,最要紧的是先满足我们平常的开发,文中如有错误,还望走过路过的大神们高抬贵手留言告知哦!谢谢🙏

本篇文章先从实战的角度来进行讲解,涉及原理的问题,请待小白进阶后,再发文,敬请期待哦!😁

一、理解git

git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。----摘自百度百科

那么接下来我们就从几个方面来理解它,并分析git在我们工作中提供了哪些便利:

1. 版本控制发展史:

u盘 -> 付费(CVS)->开源(SVN)-> 分布式(git)
复制代码

2. 优点:

    a. 方便:仓库统一管理,提交代码,拉取代码快速方便

    b.可追溯:每条提交都有记录,可追溯历史版本
    
    c. 合并冲突:可合并冲突,保持开发人员的内容统一
    
    d. 安全性较高:采用线上主仓库+本地仓库,安全性较高

复制代码

3. svngit 区别

svn: 集中式:只有一个中心服务器,只有一个最新版本

git: 分布式:每个客户端都是服务器,可以有很多个最新版本
复制代码

下面画了两张草图,帮助理解:


  1. 首先是svn,相对来说操作路径较少,比较好理解:

  2. 接下来是我们的git,这跟上图的svn相比可操作路径就较多了:

4. 关于项目托管平台

市面上有很多存储的库,例如:码云、githubgitlab

码云:既可以使用 git ,又可以使用 svn 来提交上传,通用性较强

github:属于开源代码库,是目前最火的开源项目托管平台,同时提供公共仓库和私有仓库,但如果使用私有仓库,是需要付费的。

gitlab:可以在上面创建私人的免费仓库,一般企业多选用
复制代码

二、在仓库创建一个新项目

上面介绍了gitgithub,这一趴我们来在github上创建一个项目试试。

github 官网地址

此处跳过了注册 / 登录的步骤,各位小哥哥小姐姐自行注册呦。


  1. 登录成功后,点击右上角你头像旁边的+号,选择最后一项New project创建一个新的项目。

  1. 接下来去填写项目的信息。

  1. 创建完成后会自动生成一个README.md文件,这个文件主要是存放项目的描述信息,下载方式,运行信息,文件目录等等。

是不是感觉很简单,其实不难哦!😄


三、完成最简单的git操作

我们现在已经有自己的仓库了,接下来试着模拟一下clone 线上代码,本地开发,以及提交的一系列简单操作。

1. 查看 git 的版本

查看版本号

git --version
复制代码

2. git help : 查看帮助

这里有关于怎么从下载一下项目、保存、提交、合并分支、切换分支、查看历史记录等的git查看命令帮助操作。

git help
复制代码

3. git clone : 克隆代码

这个命令用于从远程将远程仓库的内容拉到本地,也是我们学习项目操作的比较常用的命令。

git clone <版本库的地址>
复制代码

举例: 比如克隆iview的版本库,(在这给我老东家的产品悄悄的打个广告!😄哈哈)

选择你认为合适的文件夹位置存放它,然后执行下面的命令:

git clone https://github.com/iview/iview.git
复制代码

该命令会在本地主机生成一个文件夹,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。

git clone <版本库的地址> <本地你认为合适的库名>
复制代码

下载完成。

4. git status : 查看状态

养成一个好习惯,在每次提交保存代码或者要开始执行git 操作时,先执行一次 git status ,可以查看当前代码的状态。

当然执行完命令后有几种状态需要分别说明

  1. 当前工作状态为无任何修改,无需提交

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean   // (工作簿干净,无任何修改)
复制代码
  1. 当前工作簿有更改

add ‘XXXX’ (commit)
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:   src/view/index.ux   // (更改的文件,没暂存时的此行是红色)

no changes added to commit (use "git add" and/or "git commit -a")
复制代码
  1. 执行完暂存后

On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)  // (暂存后的此行是绿色)

    modified:   src/view/index.ux 
复制代码
  1. 当添加一个新文件时

On branch master
Your branch is up to date with 'origin/master'.

Untracked files: (未被跟踪的文件)
  (use "git add <file>..." to include in what will be committed)

    src/view/test.txt

nothing added to commit but untracked files present (use "git add" to track)
复制代码
  1. 当新文件执行完暂存后

On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   src/view/test.txt  (新文件)
复制代码

5. git add :添加到暂存区

在上一讲中,我们也已经用过这个命令,那么这个命令是什么意思呢?打个比方:我们平常去超市,一般会推一辆购物车,然后把我们需要买的物品放到购物车中,然后在结账的时候,一起付款。那么这个命令就好比加入购物车的过程,开发完需求后,将要提交的代码提交到暂存区,然后才可以进行向上提交。

上面一直在说暂存,那么如何执行暂存呢?

就顺着这个往下来操作添加暂存:

有两种形式:

  1. 第一种是暂存指定文件 , add 后面的地址,直接从git status 的 红色内容处复制来即可
git add src/view/test.txt
复制代码
  1. 第二种是暂存全部本地文件,将当前目录下(递归子目录)所有文件加入到暂存区, add 后面跟一个 . (点)
git add . 
复制代码

6. git commit :提交到本地仓库

当我们把本地的更改提交到暂存后,接下来就要提交我们的暂存到本地仓库

git commit -m '提交内容的备注信息'
复制代码

1 file changed,1 insertion(+)  // 1个文件有修改 1个文件新添加
create mode 100644 src/view/test.txt
复制代码

当我们把本地代码提交后,再执行一遍git status ,查看一下状态,下面的内容告诉我们,我们有一个commit,可以push推到远程:

7. git push origin :提交到远程仓库

在上面的流程里,我们已经把代码提交到里本地仓库,接下来就要把我们本地仓库推到远程仓库。

git push origin 
复制代码

接下来我们去看看github 仓库是否有我们刚刚push的记录

强制将本地的修改覆盖了远程仓库的版本,这个命令如果不是git 熟手,尽量不要使用! 不要使用!不用使用!

git push origin -f 
复制代码

写到这里我们似乎已经把一个简单的提交(提交到远程)表述完了,但我们都讲述都是一个项目一个人操作的流程,后续会分享关于多人合作配合的流程。

四、多人合作操作流程

当然我们不可能只是自己一个人在开发,更多的时候是多人协作,那大部分的git 操作失误都是基于多人操作的,我们先分别阐述比较常用的命令,最后把整体流程走一遍。

1. git remote:对远程仓库的操作

我们在开发过程中针对不同情况会有不同数量的远程仓库,一般情况下会有两个,一个是自己的远程仓库,一个是公司项目的远程仓库

查看所有的远程仓库

git remote -v 
复制代码

下图截自网络

添加远程仓库

git remote add origin <这里就放我们克隆项目的那个地址>

git remote add haozi https://github.com/myyan/test2.git
//其中这个在本机的haozi  就是关联的远程的test2的仓库
复制代码

下图截自网络

关于为什么要添加远程仓库?我的理解是这样的,当我有两台电脑,一台在公司,一台在家,我在公司开发到一半,还不能提交到线上测试,我想回家后再继续开发,那就可以添加一个自己的远程分支,在公司将代码提交到远程,回家后拉取远程就可以同步代码啦。所以我们一般入职后,公司给开通git 权限后,我们需要先把对应的项目fork 到自己名下,然后remote 添加一个自己的远程库。

2. git checkout :切换分支

根据环境不同,需求不同,我们一般会有多个分支用来区分代码块

切换到其他分支

git checkout <分支名> => git checkout qa // 切换到qa 分支
复制代码

直接拉取线上最新的代码,并创建一个新的分支,例如你线上的分支叫production:

git checkout production  // 先切到production分支

git fetch --all  // 更新所有的分支

git checkout -b <新分支名>  => git checkout -b feature-xxx  //创建完成后会自动切换到新分支
复制代码

3. git fetch :拉取远程分支

同步远程代码

1. 下面命令将某个远程主机的更新,全部取回本地

git fetch <远程主机名>  
复制代码

eg:

拉取upstream全部的更新到对应分支,qa->qa production->production

git fetch upstream 
复制代码

2. 取回特定分支的更新

git fetch <远程主机名> <分支名>  
复制代码

eg:

拉取到upstream主机的production 分支

git fetch upstream production
复制代码

4. git merge:合并指定分支到当前分支

将指定分支的代码合并到当前分支

git merge [新代码的分支,也就是指定分支] 
复制代码

eg:

假设我们现在位置是qa分支,需要将feature-classDetail分支开发的新代码合并到production分支

git checkout production

git merge feature-classDetail
复制代码

5. git merge --abort:放弃解决冲突,撤销当前的 merge 操作

多人操作时避免不了修改同一个文件,同一段代码的时候,那这时就会产生代码冲突。对于出现冲突,我们的第一反应:当然是去解决冲突了,但有时merge操作后,才发现自己改错了代码,或者想撤销合并等操作。此命令只适用于merge操作执行后,代码冲突的后的取消merge操作,并不能取消正常的无冲突的merge

下面我们就来模拟一个冲突:

分支A:

分支B:

此时将分支A 合并至 qa 分支

git checkout qa

git fetch upstram && git reset --hard upstream/qa

git merge A

复制代码

接下来我们再将分支B 合并至 qa分支,如上同样的操作,我们看一下冲突页面:

此时我们可以使用我们撤销 merge 的命令( abort 意为中止,也就是取消):

git merge --abort

复制代码

取消merge后,页面还原为合并 分支A 的内容

6. git pull:同步远程代码并合并

事实上,git pull 这个指令的内部实现就是把远程仓库使用 git fetch 取下来以后再进行 merge,但前提是需要先将本地的代码暂存起来,不然如果远程也改了相同的文件位置,会被远程的代码覆盖。(我们公司是禁止使用这个命令,明令要求大家必须分步git fetch +git merge有选择的合并)

假如你已经在本地更改了一些你的工作区,前提是你知道将要pull的内容不会覆盖你的工作区的内容,否则不要使用 pull这个命令,老老实实用git fetchgit merge来同步和合并。

git pull <远程仓库名> <远程分支名>:<本地分支名>
复制代码
git pull === git fetch + git merge
复制代码

eg:

先执行 fetch,然后将对应的远程分支 merge 合并到当前分支

git pull 
复制代码

eg:

先执行fetch,然后将对应的远程仓库 origin 的分支 merge 合并到当前分支

git pull origin 
复制代码

7. git reset:丢弃修改

重置工作区,丢弃已有的修改,丢弃暂存区和工作区对所有文件对修改

git reset --hard
复制代码

丢弃本地的所有修改,并将对标到某个主机的某个分支

git reset --hard <主机>/<分支>
复制代码

eg:

丢弃本地所有更改,并将代码更新为upstreamqa分支

git reset --hard upstream/qa
复制代码

8. git stash:将所有未提交的修改保存至堆栈中,用于后续恢复当前工作区内容

这个是我用的比较多的命令,在我们的工作中,大部分是需要快速迭代,而且还会有一个迭代有多个不相干的需求,再加上需要等待后端同学。那么在迭代开始时,我一般倾向于将多个需求分多个分支来开发,这样保证上线互相不影响。

上面👆 是背景,下面👇 是使用场景:

那么多个分支是如何保存我们的代码呢?那就用到了我们 git 的存储功能,例如我现在有A、B、C 三个分支,我先开发了A需求,但接口还没出,这时我们可以将 A 的代码存一下,然后继续再开发B的需求....

  1. 基础使用

当我们只有一个小改动,只是暂时存储一下时,我们可以直接用下面的命令,当然它不只是可以存一次,可以存多次

git stash
复制代码

  1. 查看保存的列表

上面我们将我们暂时不提交的内容暂时存储了起来,使用下面命令查看保存的列表

git stash list
复制代码

  1. 查看list 中具体的修改

上面我们已经能看到我们存的list 列表了,那么具体修改的内容是啥呢,这时我们需要使用git stash show stash@{X}命令来查看,其中 X 表示列表的序号。

git show stash@{0}
复制代码

  1. 应用到当前工作区

上面我们已经知道哪个是自己修改的版本,此时我们要将它还原到工作区,git apply stash@{X}命令来查看,X同样还是我们看到列表的序号。

git apply stash@{0}
复制代码
  1. 自定义备注名称

上面的操作中,我们使用的都是默认存储,要还原时,还需要查看一下修改内容,未免有点麻烦,那么我们这次就给每个保存的版本添加一个备注,这样我们还原时就可以直接选择对应的版本了。

git stash save '新增e'
复制代码

此时我们再看一下我们的 list:

上面的 list 中,最后一个是我们最新添加的版本,使用的就是我们自定义的备注名称。

五、其他的的功能 / 命令

我们平常用的较少,但比较实用的命令(或者可以说遇到问题时会用到的命令)

  1. 查看git历史提交记录

有时我们想恢复上一个提交,回滚代码时,一般会先查看历史提交记录,然后找到对应的编号,进行回滚

git log
复制代码

  1. 修改commit 备注信息
git commit --amend
复制代码

I健进入编辑,按esc保存编辑,:wq退出并编辑状态

编辑完退出后即可看到已经修改成功:

查看历史提交列表:

  1. 撤销最近一次的 commit 提交,常用于代码回退

有时刚刚提交了 commit 后,发现自己提交错了,想要撤销提交,还原到上次的提交,那就用到了下面的命令

这个是提交前的commit记录:

然后修改一些东西,提交上去,这是更新后的commit 记录:

然后执行下面的命令,撤销最新的 commit :

git reset --hard HEAD^
复制代码

执行后看我们更新后的 commit 记录:

如果想回退的不是最新的一个,是历史的某个commit 版本那就把commit编号记录下来:

git reset --hard d9dc2c6ff6a3f4eef3f11bd83e259fcf19a36f69
复制代码

下面就是回退后的commit记录:

  1. 删除指定的 commit

一定要认清风险,谨慎删除

git rebase -i HEAD~3 // HEAD后面的数字代表往回数几条,HEAD~3:最近3条的commit
复制代码

键盘输入i进入编辑页面,将要删除的commit前面的pick改成 drop ,然后esc 退出编辑,:wq 退出修改界面。

修改成功后会提示:

Successfully rebased and updated refs/heads/xxxxxx.

复制代码

git log再次查看就已经没有此commit记录了。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70811
 
31 次点击  
分享到微博