git

1. 一些概念

  • 工作区:就是你在电脑里能看到的目录;
  • 暂存区:stage区 或 index区。存放在 :工作区 / .git / index 文件中;
  • 版本库:本地仓库,存放在 :工作区 / .git 中
    在这里插入图片描述
  • 关于 HEAD
    • 是所有本地分支的游标(指针);
    • HEAD既可以指向某个分支,还可以指向某个分支的某个(次)提交;
    • HEAD指向谁,谁就是和当前工作区、暂存区、相关联的分支,即:对于add、checkout、commit命令去操作的分支对象!
    • HEAD的存在非常重要,因为它提供了对当前工作区状态的快速访问和管理;
    • 相关命令:
      git checkout branch_name命令切换分支,HEAD会指向所切换到的分支。
      git checkout commit_hash命令切换到某个具体的提交,HEAD会指向该提交。
  • master和origin的关系
    • master 表示本地仓库主分支(名称);
    • origin 是远程仓库的代指;origin 是远程Git仓库的默认名称;
    • origin 是远程仓库的主分支?
    • 例如在使用:git clone https://github.com/ArduPilot/ardupilot.git 下载远程仓库代码时,在后续的操作中,默认会将 https://github.com/ArduPilot/ardupilot.git 指向的远程仓用origin来表示!
  • 本地仓库
    远程仓库的拷贝(这个说法不太准确)
  • 远程仓库
    • 用于多个本地仓库的协调开发;
    • 用于备份本地仓库;
  • 分支
    • 分支也称为“快照”
    • 一个分支代表一条独立的开发线;
      使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作,最后还可以合并到主分支:
      在这里插入图片描述
    • 只有仓库才存在所谓分支,工作区和暂存区不存在分支的说法;本地仓库有分支,本地分支;远程仓库有分支,远程分支;
    • 相关命令:
      • 参考文献:http://rogerdudler.github.io/git-guide/index.zh.html
      • 在远程开好分支,本地直接拉下来;
        git checkout -b feature-branch origin/feature-branch //检出远程的feature-branch分支到本地
      • 本地开好分支,推送到远程;
        git checkout -b developer_gen3_new_branch_name //在本地创建分支
        git push --set-upstream origin developer_gen3_new_branch_name //推送到远程
      • git branch + 分支名字:创建本地分支
      • git checkout -b <分支名> :创建并切换到新的本地分支
      • git checkout<分支名>: 切换到本地分支
      • git branch 查看当前分支
      • git branch -a:查看全部分支(包含本地和远程)
      • git branch -v:查看每一个(本地)分支的最后一次提交
      • git branch --merged:查看哪些(本地)分支已经合并到当前(本地)分支
      • git branch --no-merged : 查看哪些(本地)分支还没有合并到当前(本地)分支
      • git branch --no-merged master:查看当前未合并到master分支的有哪些?
      • git branch --merged master:查看当前已合并到master分支的有哪些?
      • git merge <分支名>:希望要把哪个分支合并到当前所在的分支
      • git branch -d [branchname]:删除本地分支
      • git push origin --delete [branchname]:删除远程分支

2. Git 基本命令简述

命令说明
git remote -v查看远程仓库的地址
git add添加文件到暂存区
git status查看仓库当前的状态,显示有变更的文件。
git diff比较文件的不同,即暂存区和工作区的差异。
git commit提交暂存区到本地仓库。
git reset回退版本。
git rm将文件从暂存区和工作区中删除。
git mv移动或重命名工作区文件。
git checkout分支切换。
git switch更清晰地切换分支(Git 2.23 版本引入)。
git restore恢复或撤销文件的更改(Git 2.23 版本引入)。
  • 关于远程仓库、本地仓库相关的操作:
    在这里插入图片描述
命令说明
git remote远程仓库操作
git clone从远程获取代码库
git clone -b 分支名 仓库地址clone 指定分支
git pull下载远程代码并合并
git push上传远程代码并合并
git submodule update --init初始化子模块
git submodule update --init --recursive下载子模块代码
  • 日志
命令说明
git log查看历史提交记录
git blame 以列表形式查看指定文件的历史修改记录

3. Git 服务器

4. fork 源作者更新后如何同步更新且不覆盖自己仓库的代码

5. Git 配置自定义编辑器

  • 查看当前编辑器
    git config --global core.editor
    执行命令后没显示则表示没配置
  • 指定一个编辑器
    git config --global core.editor 编辑器名

6. 指令大全用法案例

6.1 本地

6.1.1 git remote :查看远程仓库地址origin

  • git remote -v

6.1.2 git --help :帮助

  • git --help
  • git help -a
    查看所有子命令
  • git help -g
    查看相关的概念
  • 向前、向后 一行:
    e, y
  • 输入git --help 或git subCmd --help 后出现冒号 “:” 或 “press h for help or q to quit” 的:
    按下 e, y 进行翻页

6.1.3 git status :显示工作目录和暂存区的状态

所谓状态的包括(对于状态的详细解释

  • 拟提交的变更 这是已经放入暂存区,准备使用 git commit 命令提交的变更。
  • 未暂存的变更 这是工作目录和暂存区快照之间存在差异的文件列表。
  • 未跟踪的文件 首次添加到目录中的文件。
  • 已忽略的文件
实例描述
git status显示工作目录和暂存区的状态。
git status -s以精简的方式显示文件状态。
git status --ignored显示工作目录和暂存区的状态,列出包括被忽略的文件。
查看文件的具体修改详情请移步 git diffgit diff 或 git diff -stat

git status --ignored:
在这里插入图片描述

6.1.4 .gitignore :添加忽略文件 / 文件夹

  • git上传项目时有一些目录和文件是不需要上传的,如node_modules、package-lock.json等,容易导致他人拉取后冲突。可以使用git add xx 选择性上传文件,但很麻烦。
  • 工作目录下的 .gitignore 可以配置过滤文件、文件夹;
  • . gitignore 语法:
#忽略.idea文件夹及文件夹下文件
.idea 
#忽略以.iml结尾的文件
*.iml 
# 忽略*.o和*.a文件
 *.[oa]
# 忽略*.b和*.B文件,my.b除外
*.[bB]
!my.b
# 忽略dbg文件和dbg目录
dbg
# 只忽略dbg目录,不忽略dbg文件
dbg/
# 只忽略dbg文件,不忽略dbg目录
dbg
!dbg/
# 只忽略当前目录下的dbg文件和目录,子目录的dbg不在忽略范围内
/dbg
  • . gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
    git rm -r --cached .
    git add .
    git commit -m ‘update .gitignore’

6.1.5 git diff :查看工作区、暂存区、版本库之间的差异

查看、比较被git管理的文件在工作区、暂存区和版本库之间的差异。但只针对已跟踪的文件!
四个情景下文件的差异的比较:
1)工作区和暂存区
2)工作区和版本库
3)暂存区和版本库
4)不同版本之间

  • 工作区和暂存区的差异
git diff  列出详细差异,e y键前进后退
git diff -- filename1 filename2 ...   查看多个文件在工作区和暂存区间的差异
  • 工作区和版本库的差异
git diff HEAD  工作区与最新版本库间的差异
git diff commitID  工作区与某提交版本间的差异,commitID是版本ID,git log获取版本hash
git diff HEAD -- filename1 filename2 ...  指定文件在工作区与最新版本库间的差异
git diff commitID -- filename1 filename2 ...  指定文件在工作区与某版本库间的差异
  • 暂存区和版本库间的差异
git diff --cached  暂存区和最新版本库(HEAD)间的差异
git diff --cached commitID  暂存区和指定版本间的差异
git diff --cached -- filename1 filename2 ...  指定文件在暂存区与最新版本库间的差异
git diff --cached commitID  -- filename1 filename2 ...  指定文件在暂存区与某版本库间的差异
  • 不同版本间的差异
git diff commit1ID commit2ID 版本1和版本2间的差异
git diff commit1ID commit2ID -- filename1 filename2 ...  指定文件在版本1和版本2间的差异
  • 常用的option
--stat  简洁的展示差异 
其他,如路径约束等
  • 如何获取版本hash?
    上文提到的 commitID 即 hash 值;
git log : 查看详细历史记录,按提交时间倒叙排列,包含提交时间,提交作者,提交备注以及提交的hash值;
git log --pretty=oneline : 格式化log形式,每条log只有一行,只包含 完整的hash值 和 提交的备注;
git log --oneline : 格式化log形式,每条log只有一行,只包含 短hash值 和 提交的备注;

6.1.6 git add :添加文件到暂存区:

git add *  添加所有跟踪、未跟踪文件的更改到暂存区
git add .  添加所有已跟踪、未跟踪文件的更改到暂存区
git add -u .  -u 只添加已跟踪文件的修改到暂存区
git add filename  指定文件
git add index/  指定文件夹

6.1.7 git commit :工作区或暂存区提交到版本库

# 将暂存区内容提交到版本库, 会跳进编辑器以输入提交信息
git commit
# 将某些已被跟踪的文件提交到版本库(包含工作区和版本库)
git commit [file1] [file2] [...]
# 将暂存区内容提交到版本库, 无需进入编辑器输入提交信息
git commit -m [message]
# 跳过 git add, 将所有已被跟踪的文件更改提交到版本库
git commit -am [message]
# 使用一次新的commit, 替代上一次提交,如果代码没有任何新变化, 则用来改写上一次commit的提交信息
git commit --amend -m [message]

6.1.8 git config :管理配置文件

  • git config --list
    查看配置文件
  • git config --edit
    编辑配置文件
  • git config --global core.editor 编辑器名如gedit
    指定git的默认编辑器

6.2 远程

6.2.1 git pull :拉取远程分支并与本地分支合并

  • pull 前
    pull后,工作区也会被更新,因此pull前最好先add和commit防止代码丢失。
    pull 前 先配置一些merge的属性:
git config pull.rebase false  # merge (the default strategy)
git config pull.rebase true   # rebase
git config pull.ff only       # fast-forward only
git config pull.rebase false --global # 全局属性--global 
  • git pull 拉取与本地当前分支同名的远程分支,然后合并到当前本地分支,并在本地创建一个提交
  • git pull <远程主机名> <远程分支名>:<本地分支名>
    如: git pull origin master:adrc-v1.0 将远程的master分支拉取并合并到本地的adrc-v1.0
    如果远程某分支与当前分支合并,则冒号后面的部分可以省略
  • 合并冲突
    • pull后提示冲突:手动合并冲突 ~> add ~> commit ~> push ~> 检查合并是否成功 git log
      在这里插入图片描述
    • git statusgit diff --statgit diff --name-only --diff-filter=U 查看冲突的文件列表
    • git diff --diff-filter=U 则可以看到冲突的具体内容,按e翻页
    • gedit 冲突文件名:手动解决冲突
    • git add 冲突文件 或 git add .
    • git commit :提交合并
    • git log :查看合并是否成功
      在这里插入图片描述

6.2.1 git push 推送本地当前分支到远程仓库

6.2.3 git clone 克隆远程仓库到本地

  • git clone 仓库地址
    默认克隆master分支
  • git clone -b 分支名 仓库地址
    只克隆指定分支
  • git submodule update --init --recursive
    初始化并下载子模块

6.3 分支

查看、创建、切换、合并、删除

  • 在远程开好分支,本地直接拉下来;
    git checkout -b feature-branch origin/feature-branch //检出远程的feature-branch分支到本地
  • 本地开好分支,推送到远程;
    git checkout -b developer_gen3_new_branch_name //在本地创建分支
    git push --set-upstream origin developer_gen3_new_branch_name //推送到远程
  • git branch + 分支名字:创建本地分支
  • git checkout -b <分支名> :创建并切换到新的本地分支
  • git checkout<分支名>: 切换到本地分支
  • git branch 查看当前分支
  • git branch -a:查看全部分支(包含本地和远程)
  • git branch -v:查看每一个(本地)分支的最后一次提交
  • git branch --merged:查看哪些(本地)分支已经合并到当前(本地)分支
  • git branch --no-merged : 查看哪些(本地)分支还没有合并到当前(本地)分支
  • git branch --no-merged master:查看当前未合并到master分支的有哪些?
  • git branch --merged master:查看当前已合并到master分支的有哪些?
  • git merge <分支名>:希望要把哪个分支合并到当前所在的分支
  • git branch -d [branchname]:删除本地分支
  • git push origin --delete [branchname]:删除远程分支
  • 情况一:目前本地还没拉代码,直接拉取远程分支代码
    git clone -b ac git@gitlab.yopoint.vip:ac/YoPointSwift.git
  • 情况二:本地已经拉取了代码,想拉取远程某一分支的代码到本地
    git checkout -b ac_branch origin/ac_branch 拉取远程分支到本地(方式一)
    git fetch origin ac_branch:ac_branch 拉取远程分支到本地(方式二)

6.4 查看提交历史、哈希、commit Id

  • git log
  • git log 分支名
  • git log --reflog
  • git log --format=oneline
  • 查看某人的提交
    git log --author=huangyangl

6.5 标签 tag

  • 给最新的提交大标签:git tag -a tag -m tagmsg
  • 给某个提交贴标签:git tag -a tag hash
  • 查看标签:git log --decorate
  • 查看所有标签:git tag

参考文献

多用方可熟练!!
https://haicoder.net/git/git-status.html
https://www.cnblogs.com/ygbh/p/17470075.html#_label3_0_2_0

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值