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 commit
或git 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
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,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>