LOADING

git使用

2021/12/8

git

基本概念

  • 版本库 👉.git
    • 当我们使用 git 管理文件时,比如 git init 时,这个时候,会多一个.git 文件,我们把这个文件称之为版本库。
    • .git 文件另外一个作用就是它在创建的时候,会自动创建 master 分支,并且将 HEAD 指针指向 master 分支。
  • 工作区
    • 本地项目存放文件的位置
  • 暂存区 (Index/Stage)
    • 顾名思义就是暂时存放文件的地方,通过是通过 add 命令将工作区的文件添加到缓冲区
  • 本地仓库(Repository)
    • 通常情况下,我们使用 commit 命令可以将暂存区的文件添加到本地仓库
    • 通常而言,HEAD 指针指向的就是 master 分支
  • 远程仓库(Remote)
    • 举个例子,当我们使用 GitHub 托管我们项目时,它就是一个远程仓库。
    • 通常我们使用 clone 命令将远程仓库代码拷贝下来,本地代码更新后,通过 push 托送给远程仓库。

配置命令

列出当前配置

git config --list

列出 Repository 配置

git config --local --list

列出全局配置

git config --global --list

列出系统配置

git config --system --list

配置用户名

git config --global user.name "your name"

配置用户邮箱

git config --global user.email "youremail@github.com"

分支管理

查看本地分支

git branch

查看远程分支

git branch -r

查看本地和远程分支

git branch -a

切换分支

git checkout <branch-name>

创建并切换到新建分支

checkout -b <branch-name>

删除分支

git branch -d <branch-name>

当前分支与指定分支合并

git merge <branch-name>

查看哪些分支已经合并到当前分支

git branch --merged

查看哪些分支没有合并到当前分支

git branch --no-merged
  • 查看各个分支最后一个提交对象的信息
git branch -v
  • 删除远程分支
git push origin -d <branch-name>
  • 重命名分支
git branch -m <oldbranch-name> <newbranch-name>
  • 拉取远程分支并创建本地分支
git checkout -b 本地分支名x origin/远程分支名x

// 另外一种方式,也可以完成这个操作。
git fetch origin <branch-name>:<local-branch-name>
// fetch这个指令的话,后续会梳理

-d 就是删除,会检验分支内容是不是都被合并到别的分支了,这样免得把修改内容弄丢了。
-D 就是强制删除,不做检验。

fetch 命令

将远程仓库内容更新到本地(用到不多)

fetch 推荐写法

git fetch origin <branch-name>:<local-branch-name>
  • 一般而言,这个 origin 是远程主机名,一般默认就是 origin。
  • branch-name 你要拉取的分支
  • local-branch-name 通常而言,就是你本地新建一个新分支,将 origin 下的某个分支代码下载到本地分支。

举个例子

git fetch origin feature/template_excellent:feature/template_layout
// 你的工作目录下,就会有feature/template_layout

fetch 其他写法

将某个远程主机的更新,全部取回本地。

git fetch <远程主机名>

这样子的话,取回的是所有的分支更新,如果想取回特定分支,可以指定分支名 👇

git fetch <远程主机名> <分支名>

当你想将某个分支的内容取回到本地下某个分支的

git fetch origin :<local-branch-name>
// 等价于👇
git fetch origin master:<local-branch-name>

撤销

撤销工作区修改(不懂)

git checkout --

暂存区文件撤销 (不覆盖工作区)

git reset HEAD

版本回退

git reset --(soft | mixed | hard ) < HEAD ~(num) > |
指令 作用范围
–hard 回退全部,包括 HEAD,index,working tree
–mixed 回退部分,包括 HEAD,index
–soft 只回退 HEAD

状态查询

查看状态

git status

查看历史操作记录

git reflog

查看日志

git log

文档查询

展示 Git 命令大纲

git help (--help)

展示 Git 命令大纲全部列表

git help -a

展示具体命令说明手册

git help

文件暂存

添加改动到 stash

git stash save -a "给注释"
git stash //快捷命令

删除暂存

git stash drop <stash@{ID}>

查看 stash 列表

git stash list

删除全部缓存

git stash clear

恢复改动

git stash pop <stash@{ID}>

差异比较

比较工作区与缓存区

git diff

比较缓存区与本地库最近一次 commit 内容

git diff -- cached

比较工作区与本地最近一次 commit 内容

git diff HEAD

比较两个 commit 之间差异

git diff

基本操作

有了上述的基本了解后,那么我们就来看看整体的一个流程吧。
创建本地仓库

git init

链接本地仓库与远端仓库

git remote add origin <远程Git仓库地址>
origin默认是远端仓库别名 url 可以是可以使用https或者ssh的方式新建

username 与 email

git config --global user.name "yourname"
git config --global user.email "your_email"

生成秘钥

ssh-keygen -t rsa -C "这里换上你的邮箱"

cd ~/.ssh 里面有一个文件名为id_rsa.pub,把里面的内容复制到git库的我的SSHKEYs中

新建.ssh
image.png

提交到缓存区

git add . 全部上传到缓存区
git add 指定文件

提交到本地仓库

  git commit -m 'some message'

提交远程仓库

git push <远程主机名> <本地分支名>:<远程分支名>
-f 可以强制执行

常用命令

查看远端仓库信息

  git remote -v

远端仓库重新命名

  git remote rename old new

合并分支

git merge dev --no-ff

退出注释

:q

查看日志

git log

问题

git -am 与 git -m

开发新功能时,需要切换另一分支修复 bug,又不想提交当前分支代码怎么办?

场景

当你正在修改 A 分支的代码,而此时 B 分支有紧急任务。
这时你需要切换到 B 分支先执行紧急任务。
但是,你的 A 分支代码又修改了一半,你不想提交一个 commit,该怎么办呢?

解决方案

A:直接抛弃当前修改,git rest –hard ,这个属于病急乱投医
B:匆忙提交当前代码,会多一个 commit 记录,让你的 git 凌乱不堪
C:通过 git stash 先将当前修改缓存下来,然后再切换分支,这个才是最优雅的方案

关于 git stash

运行 git stash 命令,git 会将当前代码以栈的形式缓存。
注:git stash 对新增的文件进行缓存是不起效果的,对于新增的文件,要进行缓存的话,需要先添加到暂存区(git add .)才可以进行缓存。

恢复

当 B 分支任务修改完后,切换回 A 分支,只需要使用 git stash apply 将暂存区的数据进行恢复。

$ git push origin HEAD –force 复制代码

本地代码提交跟远程冲突时,想强制覆盖远程代码该怎么办?

push -force 强制推送

众所周知,git 的 push -force 指令是不推荐被使用的,–force 会使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!所以这种只适合于你自己一人维护的分支强制推送,对于多人维护的分支,我们应该采用更加安全的方式。

–force-with-lease 更安全的方式

使用了 –force-with-lease 参数之后,上面那种安全问题就没有那么危险了。
使用此参数推送,如果远端有其他人推送了新的提交,那么推送将被拒绝,这种拒绝和没有加 –force 参数时的拒绝是一样的。
walterlv$ git push –force-with-lease To https://github.com/walterlv/walterlv.github.io.git ! [rejected] master -> master (fetch first) error: failed to push some refs to ‘https://github.com/walterlv/walterlv.github.io.git' 复制代码
请特别注意——如果你 fetch 之后在本地的 origin 相关分支上已经看到了别人的提交,依然进行强制推送,你还是会覆盖别人的提交。也就是说,–force-with-lease 解决的是本地仓库不够新时,依然覆盖了远端新仓库的问题,如果你执意想要覆盖远端提交,只需要先 fetch 再推送,它也不会拒绝的

git 添加.gitignore 后不生效问题

该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。

之所以你的规则不生效,是因为那些 .log 文件曾经被 Git 记录过,因此.gitignore 对它们完全无效。
解决方法

从 Git 的数据库中删除对于该文件的追踪; git rm -r --cached .