git指令
(1)安装git
- 自报家门:你的名字和Email地址
1
2$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
(2)创建版本库
把pwd当前这个目录变成Git可以管理的仓库
1
$ git init
将文件提交至暂存区/缓冲区
1
$ git add filename
一下子提交当前所有文件至缓冲区
1
$ git add .
将暂存区/缓冲区所有文件提交至当前分支/归档区
1
$ git commit
带有注释的提交
1
$ git commit -m "description"
(3)时光机穿梭
查看当前仓库的状态
1
$ git status
查看对应文件自己与之前的改动
1
$ git diff filename
(3.1)版本回退
- 显示从最近到最远的提交日志
1
$ git log [--graph] [--pretty=oneline] [--abbrev-commit]
--graph
像图形一样展示--pretty=oneline
可以将每个提交版本压缩到一行显示--abbrev-commit
只显示版本号的前几位,不完整显示完HEAD
指向是当前所在分支的位置origin/brachname
则是对应远程仓库分支的所在位置
较完整的日志1
$ git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
- 版本号
HEAD
表示当前版本HEAD^
表示上一个版本HEAD^^
表示上上个版本HEAD~100
表示上100个版本,没数字则默认1HEAD^2
表示第二个上一个版本(多个父节点情况)
commit-id是一串较长的哈希字符串,命令时可以只输入前几位,也可以输完整
切换到对应版本号1
$ git checkout versionNum
查看历史执行过的命令
1
$ git reflog
回退版本
1
$ git reset [--soft | --mixed | --hard] [HEAD | commit-id] versionnum
- 这种回退只对自己可见
--mixed
为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。--soft
参数用于回退到某个版本--hard
参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
回退版本并分享给他人,本质上是再一次提交,但是是通过提交旧版本覆盖当前版本的方式1
$ git revert versionnmum
(3.2)工作区和暂存区
- 工作区:就是你在电脑里能看到的目录。
- 暂存区(缓冲区):英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 当前分支/归档区:
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
(3.3)管理修改
- Git跟踪并管理的是修改,而非文件
- 每次修改,如果不用
add
到暂存区,那就不会加入到commit
中
(3.4)撤销修改
- 丢弃工作区的修改
1
$ git checkout -- filename
- 一种是filename自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是filename已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。
- 把暂存区的修改撤销掉,将文件放回至工作区
1
git reset HEAD filename
(3.5)删除文件
- 删除工作区文件
1
$ rm filename
- 但如果filename已经提交至暂存区
add
且提交commit
,将工作区文件删除后,工作区和版本库就不一致了,用git status
可以查看差别。 - 现在有两种选择:一是确实要从版本库中删除该文件;二是从版本库中恢复文件至工作区
从版本库中删除该文件
1
$ git rm filename
且要提交至分支
1
$ git commit -m "description"
至此文件就从版本库中删除,工作区暂存区版本库保持一致
从版本库中恢复文件至工作区
1
$ git checkout -- filename
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”- 但是从来没有被添加到版本库就被删除的文件,是无法恢复的
(4)远程仓库
(4.1)添加远程仓库
- 本地仓库关联至远端仓库
1
$ git remote add origin xxxxxxxxxxxx.git
- 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的
1
$ git remote [ -v | add | remove | rm]
- 本地库的内容推送到远程仓库
1
$ git push [-u] origin master
remote
关联后,第一次推送带上-u
,可以将当前本地分支与远端分支关联起来,后面执行命令可以简化,之后推送就不用带上-u
了origin
是远程仓库的在remote
自定义的名字master
是要推送到远程仓库的某一个分支- 推送过去的分支则是当前所在分支
(4.2)从远程库克隆
- 从远程库克隆一个仓库到本地
1
$ git clone xxxxxxxxxxxx.git
clone
支持ssh和http
(5)分支管理
(5.1)创建与合并分支
- 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支
- 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点
- 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长
- 创建分支
1
$ git branch branchname
- 切换分支
1
2$ git checkout branchname
$ git switch branchname
将某分支移动到某个版本号1
$ git branch -f branchname versionNum
创建并直接切换至分支
1
2$ git checkout -b branchname
$ git switch -c branchname等价于19+20的命令
查看当前所有分支
1
$ git branch
- 会列出所有分支,当前所在分支前面会标一个
*
号。
合并指定分支到当前分支
1
$ git merge branchname
删除分支
1
$ git branch -d branchname
(5.2)解决冲突
当不同的分支对同一个文件做出了不同的修改,导致merge
时发生冲突,可通过git status
查看发生冲突的的文件,此时merge
的快速合并会失效,需要手动打开文件解决冲突
(5.3)分支管理策略
- 通常,合并分支时,如果可能,Git会用
Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。 - 如果要强制禁用
Fast forward
模式,Git就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息
- 禁用
Fast forward
后的合并分支1
$ git merge --no-ff -m "description" branchname
(5.4)Bug分支
当前工作现场“储藏”起来,等以后恢复现场后继续工作
1
$ git stash
查看储存的工作现场列表
1
$ git stash list
从列表中恢复现场
1
$ git stash apply stash-id
从列表中删除现场
1
$ git stash drop stash-id
从列表中提取第一个现场恢复,并删除
1
$ git stash pop
复制一个特定的提交到当前分支
1
$ git cherry-pick commit-id
(5.5)Feature分支
- 删除一个没有合并过的分支(强制删除)
1
$ git branch -D branchname
(5.6)多人协作
查看远端仓库信息
1
$ git remote
显示更详细信息
1
$ git remote -v
创建一个远端仓库已有的分支并切换到该分支
1
$ git checkout -b branchname origin/origin_branchname
origin
是对应远端仓库的自定义名字origin_branchname
是对应的远端仓库的分支名branchname
是指在本地创建的分支名- 该操作会把远程仓库
origin
的origin_branchname
分支的内容给复制到本地的branchname
分支上,并切换到branchname
分支上
指定本地分支与远端仓库分支的链接
1
$ git branch --set-upstream-to=origin/origin_branchname branchname
从远端仓库的分支拉取下最新的提交合并到本地分支
1
$ git pull
- 拉取内容首先要想35一样建立链接,git pull==git fetch + git merge
从远端仓库的分支拉下最新的提交,并将当前提交合并到拉下的分支1
$ git pull --rebase
- 等价于git fetch + git rebase
从远端仓库的分支拉取下最新的提交,但并不与本地分支合并,只是单纯的下载1
$ git fetch
(5.7)Rebase
- 把当前分支的内容直接复制到别的分支上,并切换到对应的分支的新版本
1
$ git rebase branchname
指定a分支复制到别的b分支上1
$ git rebase b_branchname a_branchname
回退到某一版本,并通过图形化界面修改,回退到的版本后面所有版本的提交内容、提交顺序,并以拷贝重组形式,重新在回退的版本后面重新提交1
$ git rebase -i versionname
(6)标签管理
- 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本,即
tag
是和commit-id
是捆绑的 - 将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
(6.1)创建标签
- 创建新标签
1
$ git tag tagname [tagname]
- 默认标签是打在最新提交的commit上的
- 在对应的版本号上打标签
1
$ git tag -a tagname [-m "description"] commit-id
-a
指定标签名-m
则添加描述
查看所有标签
1
$ git tag
查看标签信息
1
$ git show tagname
(6.2)操作标签
删除标签
1
$ git tag -d tagname
推送某个标签至远程仓库
1
$ git push origin tagname
一次性推送全部尚未推送到远程的本地标签
1
$ git push origin --tags
标签已经推送到远程下,要删除远程标签
1
2$ git tag -d tagname
$ git push origin :refs/tags/tagname
(7)使用Github
(8)使用Gitee
(9)自定义Git
(9.1)忽略特殊文件
- 忽略某些文件时,需要编写.gitignore
- .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
(9.2)配置别名
- 配置对应命令别名
1
$ git config --global alias.mini_order order
- 删除别名:别名就在配置文件中的[alias]后面,要删除别名,直接把对应的行删掉即可。
- 配置文件
- 每个仓库的Git配置文件都放在.git/config文件
--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用- 配置Git的时候,加上—global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
- 而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中