一: Git是什么?
Git是目前世界上最先进的分布式版本控制系统, 可以有效地记录每个文件地修改历史,可以回退到任意版本,只要你愿意。
Git 三大区
工作区(Working Directory) : 开发者本地修改文件
暂存区(Stage): 暂时存放工作区修改的文件
远程仓库(Remote): 开发者讲暂存区的文件commit后,push到远程仓库
二:git常用命令
$ git init // 初始化 在工作路径上创建主分支
$ git clone 地址 // 克隆远程仓库
$ git add // 将工作区的修改提交到暂存区
$ git commit // 将暂存区的修改提交到当前分支
$ git checkout // 切换分支
$ git branch // 查看分支
$ git reset // 回退到某一个版本
$ git stash // 保存某次修改
$ git pull // 从远程更新代码
$ git push // 将本地代码更新到远程分支上
$ git reflog // 查看历史命令
$ git status // 查看当前仓库的状态
$ git diff // 查看修改
$ git log // 查看提交历史
$ git revert // 回退某个修改
三: git 各命令详解
- git clone
$ git clone 地址// 克隆远程仓库
$ git clone -b 分支名 地址 // 克隆分支代码到本地
- git config
$ git config --list // 查看config 信息
$ git config --global user.name "Your Name" // 设置用户名
$ git config --global user.email "email@example.com" // 设置邮箱
$ git config --global credential.helper wincred // 存储凭证 (可用于输入一次用户密码后,不再输入 有时我们已经用SSH key 绑定关联好了 但是每次git提交的时候 还是需要你输入用户名密码 在这个时候 敲入这个命令 将凭证存储起来 用户名密码就不需要再次输入了)
$ git config --global core.safecrlf false // 去掉git add 命令后 出现的一堆CR(回车) LF(换行)提示信息
$ git config --global alias.ci commit // 将commit命令设置别名ci git commit命令将由git ci来代替
- git add
$ git add 文件名 // 将某个文件存入暂存区
$ git add b c //把b和c存入暂存区
$ git add -u // 把所有当前目录下的文件加入缓存区域, 保存修改和删除,但是不包括新建文件。
$ git add . // 将所有文件提交到暂存区, 保存新的添加和修改,但是不包括删除
$ git add -p 文件名 // 一个文件分多次提交
git add -A 保存所有的修改
- git commit
$ git commit –m “本次提交描述” // 该命令会将git add .存入暂存区修改内容提交至本地仓库中,若文件未添加至暂存区,则提交时不会提交任何修改。
$ git commit -a //相当于运行 git add -u把所有当前目录下的文件加入缓存区域再运行git commit.
注意!对于新增的文件,并没有被commit
$ git commit –am // “本次提交描述” 或者git commit –a –m“本次提交描述” // 等于上面的合并操作
$ git commit --amend //修改最近一次提交。有时候如果提交注释书写有误或者漏提文件,可以使用此命令。对于漏提交的文件,需要git add到缓存区之后,git commit --amend才能将修改追加到最近的一次提交上。
git checkout
$ git checkout featureName // 检出featureName分支
$ git checkout -b featureName // 新建并切换至名为featureName的新分支
等价于以下两个操作:
$ git branchfeatureName
$ git checkout featureName (工作区一定要是clean的)
$ git checkout -b featureName remote_feature_name // 拉取远程分支 remote_feature_name 创建一个本地分支featureName,并切到本地分支featureName
$ git checkout -- fileName //该命令把fileName从当前HEAD中检出,即回退当前工作区的这个文件的修改
--可以省略不写
$ git checkout --hard HEAD // 回退工作区的全部文件修改
git branch
$ git branch // 查看当前所有分支
$ git branch feature // 新建分支
$ git branch -v // 查看分支以及提交hash值和commit信息
$ git branch -d feature // 删除分支
$ git branch -D feature // 强制删除 若没有其他分支合并就删除 d会提示 D不会
$ git branch -m old_feature_name new_feature_name // 修改分支名
$ git branch -M old_feature_name new_feature_name // 强制修改分支名 与其他分支有冲突也修改
$ git branch -r // 列出所有远程分支
$ git branch -a // 查看远程分支(列出所有远程分支以及本地分支)
git diff
$ git diff // 查看变更 工作区与暂存区的差异比对
$ git diff --cached // 暂存区与提交版本的差异
$ git diff HEAD // 工作区与仓库中最后一次提交版本的差别
$ git diff 版本哈希值 版本哈希值 // 查看这2个版本哈希之间的区别
$ git diff HEAD~数字 HEAD~数字 // 同上
$ git tag tt HEAD~2 // 给倒数第3次提交打一个tag tag名字是tt
$ git diff tt // 倒数第3个版本与第一个版本之间的差异
$ git diff --cached tt // 暂存区与倒数第5个版本之间的比对
git stash
$ git stash //所有未提交的修改都保存起来,用于后续恢复当前工作目录
$ git stash save "stash_name" // 给每个stash加一个message,用于记录版本
$ git stahs pop // 恢复最新缓存的工作目录(第一个),并删除缓存堆栈中的那一个stash删除(可以通过名字指定使用哪个stash)
$ git stash apply //只恢复最新缓存的工作目录(第一个), 不删除(可以通过名字指定使用哪个stash)
$ git stash list // 查看现有所有stash
$ git stash drop // 移除最新的stash,后面也可以跟指定stash的名字
$ git stash clear // 删除所有缓存的stash
git log
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short // 获取git log里的树形详细信息 包括hasg 日期 提交信息 提交人等
$ git log --oneline //拉出所有提交信息 q是退出
$ git log -5 // 查看前5次的提交记录
$ git log --oneline -5 // 打印出的日志里面只有哈希值和修改的内容备注
$ git log 文件名 // 查看该文件的提交
$ git log --grep // 想过滤看到的内容 过滤日志
$ git log -n // 查看近期提交的n条信息内容
$ git log -p // 查看详细提交记录
git reflog
如果在回退以后又想再次回到之前的版本,git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
git reset
$ git reset HEAD~n --hard // 回退到指定版本
$ git reset --files // 从仓库回撤到暂存区
$ git reset HEAD // 回退暂存区内容到工作目录
$ git reset HEAD --soft 回退提交到暂存区
$ git reset HEAD --hard // 回退提交 放弃变更 (慎用)
$ git reset HEAD^ // 回退仓库最后一次提交
$ git reset --soft HEAD~1 //将版本库软回退1个版本,所谓软回退表示将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区
$ git reset HEAD~1 //将版本库回退1个版本,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到工作区
$ git reset --hard HEAD~1 意为将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码清空(工作区是clean状态)
git clean
$ git clean -n // 列出打算清除的档案(首先会对工作区的内容进行提示)
$ git clean -f // 真正的删除
$ git clean -x -f // 连.gitignore中忽略的档案也删除
git blame
$ git blame 文件名 // 查看该文件的修改历史
$ git blame -L 100,10 文件名 // 从100行开始,到110行 逐行查看文件的修改历史
git show
$ git show HEAD // 查看最后一次提交修改的详细信息 也可以用git show 哈希值 查看对应的内容
$ git show HEAD^ // 查看倒数第二次的提交修改详细信息
$ git show HEAD^^ //或者git show HEAD~2 查看前2次变更
$ git show HEAD 或 git show 哈希值 或者git show tag(标签名) 都可以查看最近一次提交的详细信息
git mv
$ gitt mv a b // 把a文件名字改成b 并且直接放入git add后的暂存区
$ git mv b ./demos/ // 把b文件移动到demos文件夹下
git rm
$ git rm a.a 移除文件(从暂存区和工作区中删除)
$ git rm --cached a.a 移除文件(只从暂存区中删除)
$ git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)
git tag
$ git tag // 查看列出所有打过的标签名
$ git tag -d 标签名 // 删除对应标签
$ git tag 标签名字 // 在当前仓库打个标签
$ git tag foo -m "message" // 在当前提交上,打标签foo 并给message信息注释
$ git tag 标签名 哈希值 -m "message" // 在某个哈希值上打标签并且写上标签的信息
$ git tag foo HEAD~4 // 在当前提交之前的第4个版本上 打标签foo
git pull
$ git pull <远程主机名> <远程分支名>:<本地分支名> // 取回远程主机某个分支的更新,再与本地的指定分支合并
$ git pull --tags // 把远程仓库的标签也拉取下来
git push
$ git push <远程主机名> <本地分支名>:<远程分支名>