Git 版本控制
XiaoMa 博士生
  1. 进入文件夹,右键 Git Bash Here

  2. 初始化,让 git 帮助我们管理当前文件夹。

    1
    git init
  3. 检测状态:查看可以用 Git 管的文件。

    1
    git status
  4. 使用 Git 管理具体文件。

    1
    git add 具体文件名
  5. 使用 git status 查看,发现被管理的文件变绿了,没有被管理的还是红色的。

    • 红色:新增文件 / 或修改的老文件 → 需要 git add 文件名
    • 绿色:git 已经管理起来了 → 需要 git commit -m '描述信息'
    • 透明色(看不到)表示已经全部被管理起来了。
  6. 使用 Git 管理所有文件的快捷命令(add 后面加个点)。

    1
    git add .
  7. 生成版本。

    1
    git commit -m 'version 1'
  8. 使用 git status 查看,发现什么都没有了,意味着所有的文件已经被管理起来,并生成版本了。

  9. 对文件内容进行修改。使用 git status 查看,检测到有文件被修改。需要继续使用 git add 的命令将其管理起来,可以后面接具体的文件名,也可以使用【点】,把所有被修改的文件都管理起来。管理起来后,使用 git commit -m '描述信息' 生成版本。

    1
    git commit -m 'version 2'
  10. 查看版本记录。

    1
    git log
  11. 报错!需要生成个人的信息配置。

    1
    2
    git config --global user.email "you@example.com"
    git config --global user.nam "Your Name"
  12. 命令行生成文件。

    1
    touch test.py
  13. 回滚功能,回滚到之前的版本(版本号使用 git log 查看)。

    1
    git reset --hard 版本号
  14. 回滚到之后的版本。

    1
    2
    git reflog
    git reset --hard 版本号

    image-20230124224702538

  15. 使用 git checkout -- 文件名git restore 文件名 将工作区对文件的修改撤销。

  16. 使用 git reset HEAD 文件名git restore --staged 文件名 将暂存区的文件撤回到工作区。

  17. 主干线 Master。

  18. 查看 / 创建 / 切换分支

    1
    2
    3
    git branch
    git branch 分支名
    git checkout 分支名
  19. 将分支合并到 Master:首先将分支切换回 Master,然后执行合并代码,之后删除该分支。

    1
    2
    3
    git checkout master //注意一定要切换分支,分清楚谁来合并谁
    git merge 要合并的分支名
    git branch -d 已合并的分支名
  20. 合并时报错:产生冲突,需要手动解决。解决完后,使用 git status 检测到有文件被修改,使用 git add . 进行管理,使用 git commit -m '描述信息' 进行提交。

  21. 工作流,一般不在 Master 分支写代码,都在 dev 上写。稳定了再合并到 Master 分支。

Github

  1. 流程 1:注册账号→创建仓库→本地代码推送。

    1
    2
    3
    git remote add origin 远程仓库地址 //起别名,可以叫 origin,也可以叫别的
    git push -u origin master
    git push -u origin dev //有几个分支推送几个分支
  2. 流程 2:从 Github 拉到本地

    1
    git clone 远程仓库地址
  3. 在新电脑上开发,切换到 dev 分支,保证 dev 分支中的代码是最新的。

    1
    2
    git checkout dev
    git merge master //把 master 中的代码合并到 dev 中 [仅执行一次]
  4. 写完后还要推送到 Github 上。

    1
    git push origin dev //把 -u 简写掉
  5. 回到家中,先切换到 dev 分支,再把代码从远程仓库拉下来。

    1
    2
    git checkout dev
    git pull origin dev
  6. 写完后,再执行一系列的命令。如下:

    1
    2
    3
    4
    touch a2.py
    git add .
    git commit -m '在家深夜写的代码 a2.py'
    git push origin dev
  7. 到公司后,又要把家里写的代码从远程仓库拉下来。

    1
    git pull origin dev
  8. ……(重复以上步骤)

  9. 开发完毕后,上线。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    touch a3.py
    git add .gi
    git checkout master
    git merge dev
    git push origin master

    //把 dev 分支也推送到远程仓库
    git checkout dev
    git merge dev //一个习惯,其实都已经是最新的了
    git push origin dev
  10. 偶然事件:在公司忘记推送代码。在家又写了新的代码推送到了远程仓库中。到了公司将远程仓库的代码拉下来,会和之前在公司忘记推送的代码产生冲突,需手动合并。

rebase(变基)命令

使 git log 简洁。注意:如果有已推送到远程仓库的代码,就不要合并它了。

  1. 将自己的提交记录合并,合并的是文件版本号之后的所有版本。多个记录合并成一个记录。

    1
    git rebase -i 文件的版本号
  2. 强行将 dev 分支插入到 master 分支中去。(没有弄懂)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    git log --graph --pretty=format:"%h %s" //图形化查看分支提交记录

    //在 dev 分支中写代码
    git checkout dev
    touch s1.py
    git add .
    git commit -m 's1'

    //在 master 分支中写代码
    git checkout master
    touch s2.py
    git add .
    git commit -m 's2'

    //切回到 dev 分支中 rebase
    git checkout dev
    git rebase master

    //切回到 master 分支中把 dev 的代码 merge 过来
    git checkout master
    git merge dev

    //以上即可完成
  3. 云端和本地代码的合并。

    1
    2
    3
    4
    git pull origin dev

    git fetch origin dev
    git rebase origin/dev

多人协作工作流

  1. 在 Github 中创建组织,在组织中创建项目。(需要收费)

    1
    2
    git remote add origin 远程仓库地址
    git push -u origin master
  2. 基于 tag 做版本控制。相当于把一长串的哈希值用标签来表示。

    1
    git tag -a 版本号 -m '描述信息'
  3. 把 tag 也推送到远程仓库中

    1
    git push origin --tags
  4. 创建并切换到 dev 分支。

    1
    git checkout -b dev
  5. 把 dev 分支推送到远程仓库。

    1
    git push origin dev

给开源软件贡献代码

  1. fork 源代码(可以导到自己的个人账户里面)。

  2. 在自己的仓库中修改,然后上传到自己的远程仓库中。

    1
    2
    3
    4
    5
    6
    git clone 远程仓库地址
    cd tensorflow/ //进入该文件夹
    touch bug.py //修改了bug,假设是创建了文件
    git add .
    git commit -m 'xxx'
    git push origin master
  3. 给源代码作者提交修改 bug 的申请(pull request)。

其他

  1. 三个配置文件 local global system

    • 项目配置文件:项目/.git/config

      1
      2
      git config --local user.name 'xxx'
      git config --local user.name 'xxx@xx.com'
    • 全局配置文件:~/.git/config

      1
      2
      git config --global user.name 'xxx'
      git config --global user.name 'xxx@xx.com'
    • 系统配置文件:/etc/.git/config

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
           git config --system user.name 'xxx'
      git config --system user.name 'xxx@xx.com'

      需要有 root 权限

      2. 应用场景

      3. 免密登录

      - URL 中体现
      - SSH 实现
      - git 自动管理凭证

      4. gitignore 忽略文件

      让 Git 不再管理当前目录下的某些文件,更多可参考 github 中的 ignore(搜索即可)

    *.h
    !a.h
    files/
    *.py[c|a|d]

    
    
  2. 任务管理

    • issues:文档以及任务管理,也可以作为查找遇到的问题的方式。
    • wiki:项目介绍

参考

  1. 01 git是什么?_bilibili_哔哩哔哩_bilibili