git常用指令
写在前面
- 输入一个单词就可以优雅的在UI显示当前分支状态:
gitk
基础概念
工作区: 就是你在电脑里能看到的目录
暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
版本库: 工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库
创建本地仓库
初始化(告诉 git 您的姓名和公共电子邮件地址)
- 加了
-- global
后,之后每次建立仓库的提交者身份信息都是这里的 name 和 email 所以第一次创建时一定要注意
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email you@yourdomain.example.com
创建别名(可选)
$ git config --global alias.co checkout // check 创建别名 co
$ git config --global alias.br branch // branch 创建别名 br
$ git config --global alias.ci commit // commit 创建别名 ci
$ git config --global alias.st status // status 创建别名 st
$ git config --global alias.visual '!gitk' // gitk 创建别名 visual 这里不是git子命令,因此前面加了!
创建版本库
$ git init // 在本地表现为新建的.git文件夹
$ git add . // 将当前文件夹下的内容全部推送到暂存区(后面跟文件名就是推送单个文件)
// 加入暂存区后,会跟踪当前文件的改变,直到 commit
$ git commit -m '版本1' // 创建版本信息,后面 -m '版本1' 为说明,该操作将暂存区内容推送到版本库
// 可以加 -a 参数,在 commit 的时候,可以省一步 git add ,但也只是对修改和删除文件有效, 新文件还是要 git add,不然就是 untracked 状态
$ git tag -a v1.0 -m "说明" // 通过该指令为最后一次提交打上标签(v1.0)后面的 -m 为标签增加说明信息
$ git tag -a v0.9 85fc7e7 // 也可以通过该指令给指定版本打标签(85fc7e7为版本号)
$ git tag -d tagname // 删除指定标签
修改 & 撤销修改
- 文件改名
$ git mv file_from file_to // file_from 改名为 file_to
- 我们修改完文件后直接,可以通过
add、commit
命令,将修改的文件推送到暂存区和版本库 - 若要撤销修改可以使用下面的指令
$ git checkout -- file // 这里区别于下面的分支切换和HEAD切换(加了--)
// 但上面是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它
$ git reset HEAD file // 将修改回退到工作区
$ git reset HEAD -- file // 加双杠也是将修改回退到工作区
// 同样危险
理解应用
- 若只是修改了工作区的文件直接使用
git checkout -- file
就可以了 - 若已经将修改的文件推送到了暂存区,使用
git reset HEAD file
,可以回退到第1步(将修改回退到工作区) - 再执行第1步,就可以从工作区撤销修改
注意:
git中已提交的内容丢失了一般可以恢复,但未提交的一般都恢复不了,因此上面两项指令一般不常用到
git commit --amend
命令用来修复最近一次commit. 可以让你合并你缓存区的修改和上一次commit, 而不是提交一个新的版本
- 但应注意,由于是合并 commit,因此不应在公共commit中使用
分支重置
$ git reset --mixed // 将指定 commit id 撤回之后所有内容全部放进 工作区
$ git reset --soft // 将指定 commit id 撤回之后所有内容全部放进 暂存区
$ git reset --hard // 将指定 commit id 撤回并 清空 工作目录及暂存区所有修改
注意:
若 reset
后无参数,默认是 --mixed参数
分支管理
创建 & 切换分支
$ git branch // 获取所有分支
$ git branch demo // 创建 demo 分支
$ git checkout -b demo // 创建一个分支 demo 并切换到其上工作
$ git switch demo // 切换到 demo 分支
$ git checkout demo // 切换到 demo 分支
$ git merge demo // 将demo分支与master分支合并
注意:
- 如果工作区有文件修改是不能通过
switch、checkout
切换分支的,一般至少要推送到暂存区或者撤销修改
若出现上述问题,不想推送到暂存区或者撤销修改也可以使用stash
系列命令暂存当前状态
Tip:一般用于当前分支还未开发完,但是急需去其他分支操作的情况(如:去master分支debug)
$ git stash // 暂存当前状态
$ git stash list // 查看所有暂存的状态
$ git stash pop name // 切换到 name 的状态
应用
- 通过
git stash
暂存当前状态 - 去其他分支操作
- 通过
git stash list
获取所有暂存状态,每个状态显示为stash@{0}: WIP on master: 450e7a1 asd
形式(stash@{0}
为每个状态的编号) - 通过
git stash pop name
切换到编号为name
的状态 ,如git stash pop stash@{0}
分支合并 & 删除分支
$ git merge demo // 将demo分支与master分支合并
$ git branch // 查看分支
// --merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支
- 合并分支后就可以删除当前分支了
$ git branch -d demo // 删除demo分支(本地)
$ git push name --delete Branch //删除远端仓库(name)中的 Branch 分支
$ git checkout -f test // 强制切换至 test 分支,丢弃当前分支的修改
版本管理
查看历史提交
$ git log // 查看历史记录
// 加 --p 参数来获取每个版本的详细信息(各版本的完整差异)
// 加 --oneline 选项来查看历史记录的简洁的版本
// 加 --reverse 参数来逆向显示所有日志
$ git diff // 显示已进行但尚未推送到暂存区的内容
// 加 --cached 参数,简单的显示已暂存的内容
$ git status // 获取git状态摘要
版本回退
※ HEAD本质上是个指向 commit 对象的可变指针
- 可以通过 HEAD~n ,让 HEAD 指向 前n个 版本
- 通过 HEAD 指向不同,可以在 merge 时合并不同的版本
$ git checkout HEAD~n // 往前回退n个版本
$ git log -1 HEAD // 查看最后一次提交
用户协作
配置密钥
- 输入指令
ssh-keygen -t rsa -C "you@yourdomain.example.com"
生成密钥(一路回车,也可以回车两次后输入密码,不输入密码就是默认无密码) - 出现下图表示生成完毕
- 输入
type C:\Users\username\.ssh\id_rsa.pub | clip
指令将公钥复制到剪切板,直接粘贴到远程仓库中
连接远程仓库
这里首先默认已经按照上面(创建本地仓库),通过git config
配置好个人信息,并配置好密钥了
$ git remote add name git@github.com:xxx.git // 连接远程仓库 name为仓库别名 后面是仓库地址
$ git remote -v // 查看当前远程仓库
$ git remote show // 查看远程仓库 name 的详细信息
$ git fetch name // 从远程仓库(name)拉取仓库中有但你没有的信息
$ git pull name master // 从远程仓库(name)拉取仓库中拉取 master 分支
通过 name/master
访问远程仓库(name)的master
分支
远端推送
$ git push name master // 将本地的 master 分支推送到远程的 name 仓库
- 用 rebase 进行 commit 融合
$ git rebase -i HEAD~n // 选择前n个版本合并(具体还有vim操作见下链接)
- 用 rebase 合并分支
$ git rebase -i master demo // 将 demo 分支 rebase 到 master 分支
rebase 相关参考:https://blog.csdn.net/xiaozhidexiao/article/details/78509676