Git常用命令速览复习

本文最后更新于:2021年11月8日 中午

Git 常用命令速览复习。

参考教程:廖雪峰 Git 教程

git init # 创建仓库
git add filename1, [filename2] # 将文件添加至 git 管理
git commit -m "msg" # 提交文件修改,一次提交仓库内的多个文件

git status # 掌握仓库当前的状态
git diff filename # 查看未提交文件的修改

git log # 查看提交日志 
git reset  --hard HEAD^ # 版本更改,在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100,或者直接通过 commit id 来更改
git reflog # 查看历史命令日志

工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。

Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index )的暂存区,还有 Git 自动创建的第一个分支master,以及指向master的一个指针叫HEAD

前面把文件往 Git 版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因此,务必要将修改或添加的文件添加至暂存区才能进行提交。

git restore filename # 将文件在工作区的修改全部撤销,要么撤销到暂存区的状态,要么撤销到版本库的状态

这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

如果你的文件已经通过git add提交到暂存区:

git restore --staged filename # 将暂存区中的文件撤销,重新放回工作区(如果工作区文件又进行了修改,则不会覆盖)

删除文件:

git rm filename # 删除已经提交的文件(需要重新提交)

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout -- test.txt

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

远程仓库设置:

# 创建用户名和邮箱
git config --global user.name "yourname"
git config --global user.email "your_email@youremail.com"

# 生成秘钥
ssh-keygen -t rsa -C "your_email@youremail.com"

# 添加远程仓库
# 远程库的名字就是 origin,这是 Git 默认的叫法,也可以改成别的
git remote add origin https://github.com/RoOtZwY/git-learning.git

# 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
# 由于远程库为空,第一次推送 master 分支时,加上-u参数,会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的master分支和远程的master分支关联,在以后的推送或者拉取时就可以简化命令。
git push -u origin master

# 提交到 master 后 push 到远程仓库
git push origin master

# 查看远程库信息
git remote -v

# 根据名字删除,比如删除origin
git remote rm origin

远程仓库克隆:

# 将远程仓库克隆到当前文件夹
git clone git@github.com:用户名/仓库名

GitHub给出的地址不止一个,还可以用https://github.com/用户名/仓库名这样的地址。实际上,Git支持多种协议,默认的git://使用SSH,但也可以使用HTTPS等其他协议。

使用HTTPS除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用SSH协议而只能用HTTPS

分支管理:

Git鼓励大量使用分支。

在版本回退里,每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

当创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支。

# 创建并切换到dev分支
git checkout -b dev

# git checkout 命令加上 -b 参数表示创建并切换,相当于:
# 创建
git branch dev
# 切换
git checkout dev
# 新版本的Git提供了新的git switch命令来切换分支
git switch dev

# 列出所有分支
git branch

# 合并指定分支到当前分支
git merge 指定分支

# 删除分支
git branch -d dev

# 查看分支情况
git log --graph --pretty=oneline --abbrev-commit

保存当前工作环境:

如果你想在新的分支上操作,但目前的分支工作为完成,可以使用:

# 保存当前分支状态
git stash

# 查看保存状态
git stash list

# 恢复不删除
git stash apply
# 恢复删除
git stash pop
# 直接删除
git stash drop

# 为了方便操作,Git 专门提供了一个 cherry-pick 命令,让我们能复制一个特定的提交到当前分支
git cherry-pick <分支id>