Git 简介

常用命令

Git:分布式版本管理控制系统。

初始配置

  1. 下载 Git(推荐安装 TortoiseGitSublime Merge)。

  2. 注册 Github。

  3. 连接 Git 和 Github:

    1. 打开 Git Bash 并输入以下命令,为本地 Git 配置邮箱和名称:

      git config --global user.email "you@example.com"
      git config --global user.name "Your Name"
      
    2. 生成本地 SSH 密钥:右键点击并选择 "Git Bash",然后输入命令 ssh-keygen 并按回车键即可。这将生成两个文件:id_rsaid_rsa.pub

    3. 配置 Github 使用 SSH:在 github.com -> Settings -> SSH and GPG keys 中,复制 id_rsa.pub 文件的内容,并将其命名为 ssh_20210621

    4. 配置 SSH 通信方式:

      • 打开 D:\Program Files\TortoiseGit\bin\puttygen.exe,选择 RSA 并点击 "load",选择 id_rsa 文件并点击 "Save private key",将其命名为 zyjhandsome_private_key.ppk
      • 打开 D:\Program Files\TortoiseGit\bin\pageant.exe,点击 "Add Key",选择 zyjhandsome_private_key.ppk 文件并点击 "Close"。

创建和连接仓库

  1. 确保 Git 和 Github 已连接。在要创建项目的文件夹中,右键点击并选择 "Git Bash",输入命令 git init,这将生成一个 .git 文件夹(隐藏文件夹)。
  2. 连接本地和 Github 仓库,输入命令:git remote add orgin xxx(例如:git@github.com:zyjhandsome/test.git)。

下载(Master和Branch代码)和上传文件

  1. 从远程仓库下载文件到本地。

    • 从 origin 远程仓库 master 分支下载文件。

      git pull origin master
      
    • 从 upstream 远程仓库 master 分支下载文件。

      git pull upstream master
      
    • 下载分支代码。

      git clone -b <分支名称> <git地址>
      
      # 举例,从XX远程仓库OpenHarmony-3.2-Release分支下载文件
      git clone -b OpenHarmony-3.2-Release https://gitee.com/openharmony/docs.git
      
    • 下载特定Tag分支代码。

      git clone --branch <tags标签> <git地址>
      
  2. 将本地文件上传到 Github:

    1. 修改文件后,输入命令(将文件添加到暂存区):git add index.html(index.html 可以是修改或新建的文件,可以有多个)。
    2. 输入命令(将文件提交到本地仓库):git commit -m 'This is a example to commit files.'
    3. 输入命令(将文件推送到远程仓库):git push origin master
    // 1、Git安装完成之后,进行全局配置用户名和邮箱
    git config --global user.name "name"
    git config --global user.email "xxx@email.com"
    
    
    // 2、创建SSH Key,并在github中进行添加秘钥
    ssh-keygen -t rsa -C "youremail@example.com"
    ssh -T git@github.com // 判断本地和github连接是否为通的状态
    
    
    // 3.1 首次提交,提交代码到远程仓库
    echo "# test" >> README.md // 可选,新建一个README.md文件,并写入 test
    git init // 初始化版本库
    git add README.md // git add添加文件到暂存区
    git commit -m "first commit" // 提交到本地仓库中,并添加备注
    // 本地仓库和远程仓库关联起来
    git remote add origin git@github.com:zyjhandsome/test.git
    // 将文件推送到远程仓库
    git push -u origin master
    
    // 3.2 提交到一个已有的仓库中
    git remote add origin git@github.com:zyjhandsome/test.git
    git push -u origin master
    
    
    // 4、GitHub克隆到本地
    git clone git@github.com:zyjhandsome/test.git
    
    
    // 5、标签管理
    git tag // 查看所有标签
    git tag name // 创建标签
    git tag -a name -m "comment" // 指定提交信息
    git tag -d name // 删除标签
    git push origin name // 标签发布,将标签推送到远程仓库
    
    
    // 6.1 分支管理,比如开发一个项目需要两周,在一周之后,还是一个不完整的代码,为了防止替换了已经完整的代码,引入分支管理
    git branch feature_name // 创建一个分支
    git branch // 查看所有的分支(*表示当前所在的分支)
    git checkout feature_name // 切换到feature_name分支
    
    // 6.2 提交代码到分支中(首先切换到本地分支)
    git add <filename> // 添加修改后的代码到暂存区
    git commit -m "desc_xxx" // 提交到本地仓库中,并添加备注
    git status // 查看当前状态
    
    // 6.3 Merge代码到master分支
    git checkout master // 切换到master分支
    git merge feature_name // 将feature_name分支上的代码merge到master分支上
    
    // 6.4 删除本地分支代码
    git branch -d feature_name
    

汇总

1、工作流: 工作区 -> 暂存区 -> 版本库

2、初始化(本地仓库): 
git init // 工作区,初始化本地仓库,将当前目录配置成Git可以管理的仓库,该目录下会多出来一个`.git`文件夹
git add <filename> // 添加<filename>文件到暂存区,告知Git,把文件添加到仓库
git add . // 表示添加新文件和编辑过的文.
git commit -m "xxx" // 提交到本地仓库,`-m`后面输入本次提交的说明

3、关联/推送远程仓库: 
git remote add origion <url> // 本地已有仓库关联到远程仓库(如: git@github.com:zyjhandsome/test.git))
git pull <remote> <branch> 
    /* pull 等价于 fetch+merge */
	/* Example1: git pull git@github.com:zyjhandsome/test.git master --allow-unrelated-histories */
    /* Example2 (fatal: refusing to merge unrelated histories 报错时,进行强制合并): git pull git@github.com:zyjhandsome/test.git master --allow-unrelated-histories */
git push -u origin master

git remote -v // 查看本地仓库与远程仓库的关联详情
git remote remove origion // 解除与远程仓库的关联

4、克隆远程仓库到本地(先选择到被选择的目录中): git clone <url> // git@github.com:zyjhandsome/test.git
5、拉取远程仓库到本地(先选择到被选择的目录中): git pull
6、分支管理: git branch -> git checkout -> git merge
7、标签管理: git tag -> git push
8、查看状态: git status
9、比较差异性: git diff HEAD --xxx // 比较上一个版本跟当前xxx文件的差异性(暂存区的差异性)

代码更新

git pull upstream master // 从顶级库更新最新代码到本地

// 如果本地已经修改代码,需要先暂存本地代码,更新之后,再Pop出来
git stash
git pull upstream master
git stash pop

// 如果上述操作出现了冲突,则详见下方【解决冲突】栏

代码提交

git status // 获取当前的状态

git add <filename> // 添加<filename>文件到暂存区,告知Git,把文件添加到仓库
git add . // 表示添加新文件和编辑过的文.
git commit -m "xxx" // 提交到本地仓库,`-m`后面输入本次提交的说明

git push origin master // Push代码到origin仓库的master分支
git push -u origin master // Push代码到origin仓库的master分支
// 当远程分支落后本地,强制推送到远端
git push -f origin master // Push代码到origin仓库的master分支

版本回退

情形1(已经commit到本地仓库):

// 初始化和第一次提交到本地仓库
git init
git add xxx
git commint -m 'first commint'

// 第二次提交
git add xxx
git commit -m 'second commit'

回退:

git log // 显示从最近到最远的提交日志信息
git log --pretty=oneline // 显示简要的提交日志信息
git reflog // 记录每一次命令

git reset --hard HEAD^ // HEAD^: 回退到上个版本, HEAD^^: 回退到上上个版本, HEAD~100: 回退到上100个版本

情形2(只是本地工作区进行了修改),回退方式:

// 这里有两种情况
// 情形1: xxx文件自然修改,还未到暂存区,执行该命令之后,撤销修改就回到和版本库一模一样的状态
// 情形2: xxx文件已经添加到暂存区后,又做了修改,现在撤回到添加到暂存区后的状态
git checkout -- xxx // xxx为需要回退的文件,把 xxx 文件,在工作区的修改全部撤销
// 上面命令逐渐会替换为以下两条语句
git restore xxx
git restore [<options>] [--source=<tree>] [--staged] [--worktree] [--] <pathspec>…​
git restore [<options>] [--source=<tree>] [--staged] [--worktree] --pathspec-from-file=<file> [--pathspec-file-nul]
git restore (-p|--patch) [<options>] [--source=<tree>] [--staged] [--worktree] [--] [<pathspec>…​]

分支管理

本地仓库的分支管理:

// 创建和切换分支
git checkout -b dev // checkout 命令加上`-b`表示创建和切换
// 上面命令逐渐会替换为以下两条语句
git switch <分支名> 和 git switch -c <分支名> 

// 相当于两条命令: `git branch dev` 和 `git checkout dev`
git branch // 查看当前分支, 切换到dev分支,切换到主分支: `git checkout master`
git branch -a // 查看所有分支
git checkout <branch name> // 切换分支
git switch <branch name> // 切换分支(推荐)

git -d <branch name> // 删除本地分支

// 切换到dev分支
git checkout dev
// 将需要提交的文件添加到dev分支的暂存区
git add <filename> // or: `git add .`
// 将需要提交的文件提交到dev分支的本地仓库
git commit -m <commit comment>
// 将dev分支内容合并到master分支
// 首先切换到master分支
git checkout master
// 将dev分支的内容合并到master分支
git merge dev

// 合并完成之后,就可以删除dev分支了
git branch -d dev

// 提交到远程仓库
git push -u origion master


// 举例
//  本地 -> origin (个人远程仓库) -> upstream (顶级仓库)
//  upstream库有两个分支:master、dev-20210414
// 情形1:upstream (顶级仓库) 新建了一个分支:dev-20210414,需要同步到本地和origin仓库,新建相应的分支
// Step1:本地新建一个同名分支并和远程进行关联
git checkout --track dev-20210414 // dev-20210414为分支名称
// Step2:本地切换到dev-20210414分支
git switch dev-20210414
// Step3:推送和新建分支到个人远程仓库并
git push origin dev-20210414:dev-20210414 // 推送本地的dev-20210414分支到远程origin的dev-20210414分支(没有会自动创建)


// 情形2:修改文件A,提交到远程仓库的dev-20210414分支
git branch // 查看当前分支,如果不是dev-20210414分支,则用命令`git switch dev-20210414`切换到需求分支
git pull upstream dev-20210414 // 从顶级库拉取最新代码
// 修改文件A
git status // 查看当前状态(修改文件等)
git add . // 暂存修改的文件
git commit -m "Modify file of A" // 提交修改的文件
// ** 此时本地切换到master分支,可以看到A文件又会恢复原装,仅仅在dev-20210414分支上进行了修改
git push -u origin dev-20210414 // 推送到个人远程仓库
// 后面就是在dev-20210414分支上正常提交到顶级库的流程


// 情形3:需要将修改的文件同时推送到两个或多个不同的分支
// 如需要将修改的文件A同时推送到master分支和dev-20210414分支
// 可以先将相关更改的文件暂存起来,切换到需要提交的分支再Pop出来

git branch // 查看当前分支,假设当前分支是master分支
git pull upstream master // 从顶级库拉取最新代码
git stash save "暂存1" // "暂存1"为自定义命名的一个暂存名称
git stash list // 可以看到当前暂存的数据,默认 "暂存1" 会在最新的位置,即位置0
git stash apply 0 // Pop出需要提交的文件,或者使用命令 `git stash pop` 默认弹出最新的暂存文件

// 1. 提交代码到master分支
git status // 查看当前状态(修改文件等)
git add . // 暂存修改的文件
git commit -m "Modify file of A" // 提交修改的文件
git push -u origin master // 推送到个人远程仓库
// 后面就是在master分支上正常提交到顶级库的流程


// 2. 提交代码到dev-20210414分支
git branch // 查看当前分支
git pull upstream dev-20210414 // 从顶级库拉取最新代码
git switch dev-20210414 // 切换到dev-20210414分支
git stash list // 可以看到当前暂存的数据,默认 "暂存1" 会在最新的位置,即位置0
git stash apply 0 // Pop出需要提交的文件,或者使用命令 `git stash pop` 默认弹出最新的暂存文件
git status // 查看当前状态(修改文件等)
git add . // 暂存修改的文件
git commit -m "Modify file of A" // 提交修改的文件
git push -u origin dev-20210414 // 推送到个人远程仓库
// 后面就是在dev-20210414分支上正常提交到顶级库的流程

解决冲突

在VS Code中,会直接提示冲突的代码内容

  • 当前更改:当前代码库中的代码(比如:upstream)
  • 传入的更改:stashed changes(本地/本次提交的修改)
// 创建和切换分支feature1
git switch -c feature1

// 修改Branch.txt文件
// 内容: Hello, I am here.
git add Branch.txt // 添加到feature1分支的暂存区
git commit Branch.txt // 提交到feature1分支的本地仓库

// 切换回主分支
git switch master
// 修改Branch.txt文件
// 内容: Hello, world.
git add Branch.txt // 添加到master分支的暂存区
git commit Branch.txt // 提交到master分支的本地仓库

git merge feature1 
    // 会产生如下冲突: 
    Auto-merging Beanch.txt
	CONFLICT (content): Merge conflict in Beanch.txt
	Automatic merge failed; fix conflicts and then commit the result.
    
git status // 查看冲突内容
// 打开Branch.txt文件,能看到冲突差异性
vim Branch.txt
    // HEAD为主分支内容, feature1为feature1分支内容
	<<<<<<< HEAD
	Hello. I am here!
	=======
	Hello, world.
	>>>>>>> feature1
	
	// 修改成:
	Hello, world. I am here!

git add Branch.txt
git commit -m 'conflict fixed'

git branch -d feature1 // 完成之后,选择性删除分支


// Git小乌龟工具,右键 -->> 解决冲突

标签管理

Git工作流

Sublime Merge介绍

远程仓库更新

  1. 复制远程仓库 SSH 地址

  2. 克隆项目到本地

    git clone git@github.com:userName/`projectName`.git
    
  3. 用 Sublime Text 3 打开该项目

  4. 将文件添加到暂存区
    Ctrl + Shift + P 调起命令面板,输入Git: Add All,将文件提交至暂存区

  5. 提交注释(提交到本地版本库)
    Ctrl + Shift + P 调起命令面板,输入Git: Commit,将文件提交至版本库

    这时会弹出 提交注释的文件,在最上方输入此次更新的内容和目的,关闭该文件即自动触发提交日志操作。

  6. 将文件上传
    Ctrl + Shift + P 调起命令面板,输入Git: Push,将文件提交至版本库

本地仓库上传

  1. 先在 https://github.com 上创建一个和本地仓库名字相同的线上仓库
    用 Sublime Text 3 打开该项目
  2. 初始化仓库
    Ctrl + Shift + P 调起命令面板,输入Git: Init,回车,确认路径,回车
  3. 用 Sublime Text 3 打开该项目
  4. 将文件添加到暂存区
    Ctrl + Shift + P 调起命令面板,输入Git: Add All,将文件提交至暂存区
  5. 提交注释(提交到本地版本库)
    Ctrl + Shift + P 调起命令面板,输入Git: Commit,将文件提交至版本库
    这时会弹出 提交日志的文件,在最上方输入此次更新的内容和目的,关闭该文件即自动触发提交日志操作。
  6. 将文件上传
    Ctrl + Shift + P 调起命令面板,输入Git: Add Remote + Remote Name (e.g., "origin"),将文件提交至版本库
  7. 将文件提交至远程版本库
    Ctrl + Shift + P 调起命令面板,输入Git: Push,回车,确认路径,回车
    报了一个错,因为没有指明远程仓库的名字和url地址

    配置远程仓库地址

    由于Sublime Text 的 Git 命令不能带参数,在 Git Bash 中完成

    git remote add origin git@github.com:userName/projectName.git

修改Pull和Push为不同地址以及SublimeMerge的使用

修改Pull和Push为不同地址

git remote set-url origin top_stream_remote_url // top_stream_remote_url即为顶级库的地址
git remote -v // 查看当前的远程分支情况
git remote set-url --push origin user_remote_url // user_remote_url即为自己配置的地址,个人远程仓库(即修改推送到自己的远程仓库,再从远程仓库Merge请求到顶级库)
git remote -v // 查看配置是否生效

相关目录:

// 推送 (Push): 
本地 -> (右侧: Add/Stage/Stage Lines) 暂存区 -> (右侧: Commit) 本地仓库 -> (Push) 个人远程仓库 -> (Merge Request) 顶级仓库

备注:(Discard/Discard Lines) 撤销

// 拉取 (Pull):
(Merge Request) 顶级仓库 -> Fetch -> (找到最新的拉取分支) Rebase Master onto this commit 

// 本地修改,但不是最新代码时:
先 (上方) Stash (git stash),再Pull(Fetch),然后再恢复修改的代码 (上方) 

名词解释:
Revert hunk: 恢复Commit之后的代码到Unstage状态
Hunk history: 查看该文件历史提交记录

SublimeMerge的使用

Step1:Open Repository(打开本地仓库)

默认:

​ master:本地仓库

​ origin:配置的(Push)远程仓库

参考

代码管理参考

教程参考

软件参考


日志

  • 2020年08月06日14:05:08 初始版本
  • 2021年06月21日00:23:07 增加git SSH通信方式相关配置
  • 2023年04月14日01:54:48 优化章节内容,并增加下载分支代码的方式
  • 2023年06月07日14:45:39 优化部分描述内容

posted on 2020-08-06 14:05  zyjhandsome  阅读(269)  评论(0编辑  收藏  举报