4.Git 本地操作(高层命令)
初始化仓库 git init
记录每次更新到仓库
工作目录下面的所有文件都不外乎这两种状态:已跟踪 或 未跟踪
已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它
们的记录,工作一段时间后,它们的状态可能是已提交,已修改或者已暂存
检查当前文件状态
命令:git status
作用:确定文件当前处于什么状态
跟踪新文件(暂存)
命令:git add 文件名
作用:跟踪一个新文件
再次运行 git status 命令,会看到 README 文件已被跟踪,并处于暂存状态
暂存已修改文件
运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来
查看已暂存和未暂存的更新
1. 当前做的哪些更新还没有暂存?,
命令:git diff(不加参数直接输入 git diff)
2. 有哪些更新已经暂存起来准备好了下次提交?
命令: git diff –cached 或者 git diff –staged(1.6.1 以上)
提交更新
当暂存区域已经准备妥当可以提交时,在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用 git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit
另外也可以用 -m 参数后跟提交说明的方式,在一行命令中提交更新:
命令:git commit –m “message xxx”
跳过使用暂存区域
git commit -a
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中注册删除(确切地说,
是在暂存区域注册删除),然后提交。可以用 git rm 命令完成此项工作,并连带
从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
文件改名
git mv 原文件名 新文件名
查看历史记录
git log
git log 参数
git log --pretty=oneline
git log --oneline
Git 分支操作
分支:指向最新提交对象的一个指针
创建分支
git branch 分支名 创建 一个新分支,并不会自动切换到新分支中去
git branch 不只是可以创建与删除分支。 如果不加任何参数运行它,
会得到当前所有分支的一个列表
git branch -d name 删除分支
git branch -v 可以查看每一个分支的最后一次提交
git branch name commitHash 新建一个分支并且使分支指向对应的提交对象
git branch –merged 查看哪些分支已经合并到当前分支在这个列表中分支名字前没有 * 号的分支通常可以使用
git branch -D name 强制删除分支
git branch --no-merged 查看所有包含未合并工作的分支
查看当前分支所指对象
git log --oneline –decorate
切换分支
git checkout name
切回 master
git checkout master
查看项目分叉历史
git log --oneline --decorate --graph --all
分支合并
命令:git merge 分支名
撤销
git commit –amend
git reset HEAD 文件名 作用:将文件从暂存区中撤回到工作目录
git checkout -- 文件名 作用:将在工作目录中对文件的修改撤销
总结
### 安装
git --version
### 初始化配置
git config --global user.name "damu"
git config --global user.email damu@example.com
git config --list
### 初始化仓库
git init
### C(新增)
在工作目录中新增文件
git status
git add ./
git commit -m "msg"
### U(修改)
1.在工作目录中修改文件
2.git status
3.git add ./
4.git commit -m "msg"
### D(删除 & 重命名)
1.git rm 要删除的文件 git mv 老文件 新文件
2.git status git status
3.git commit -m "msg" git commit -m "msg"
### R(查询)
git status : 查看工作目录中文件的状态(已跟踪(已提交 已暂存 已修改) 未跟踪)
git diff : 查看未暂存的修改
git diff --cache : 查看未提交的暂存
git log --oneline : 查看提交记录
### 分支
分支的本质其实就是一个提交对象!!!
HEAD:
是一个指针 它默认指向master分支 切换分支时其实就是让HEAD指向不同的分支
每次有新的提交时 HEAD都会带着当前指向的分支 一起往前移动
git log --oneline --decorate --graph --all : 查看整个项目的分支图
命令太长,可重命名:
git config --global alias.name "log --oneline --decorate --graph --all"
git branch : 查看分支列表
git branch -v: 查看分支指向的最新的提交
git branch name : 在当前提交对象上创建新的分支
git checkout -b name : 在当前提交对象上创建新的分支并切换上去
git branch name commithash: 在指定的提交对象上创建新的分支
git checkout name : 切换分支
git branch -d name : 删除空的分支 删除已经被合并的分支
git branch -D name : 强制删除分支
合并分支 git merge branchname
快进合并 --> 不会产生冲突
典型合并 --> 有机会产生冲突
解决冲突 --> 打开冲突的文件 进行修改 add commit
### git分支的注意点
在切换的时候 一定要保证当前分支是干净的!!!
允许切换分支:
分支上所有的内容处于 已提交状态
(避免)分支上的内容是初始化创建 处于未跟踪状态
(避免)分支上的内容是初始化创建 第一次处于已暂存状态
不允许切分支:
分支上所有的内容处于 已修改状态 或 第二次以后的已暂存状态
在分支上的工作做到一半时 如果有切换分支的需求, 我们应该将现有的工作存储起来
git stash : 会将当前分支上的工作推到一个栈中
分支切换 进行其他工作 完成其他工作后 切回原分支
git stash apply : 将栈顶的工作内容还原 但不让任何内容出栈
git stash drop : 取出栈顶的工作内容后 就应该将其删除(出栈)
git stash pop : git stash apply + git stash drop
git stash list : 查看存储
### 后悔药
撤销工作目录的修改 : git checkout -- filename
撤销暂存区的修改 : git reset HEAD filename
撤销提交 : git commit --amend
### reset三部曲
git reset --soft commithash ---> 用commithash的内容重置HEAD内容
git reset [--mixed] commithash ---> 用commithash的内容重置HEAD内容 重置暂存区
git reset --hard commithash ---> 用commithash的内容重置HEAD内容 重置暂存区 重置工作目录
### 路径reset
所有的路径reset都要省略第一步!!!
第一步是重置HEAD内容 我们知道HEAD本质指向一个分支 分支的本质是一个提交对象
提交对象 指向一个树对象 树对象又很有可能指向多个git对象 一个git对象代表一个文件!!!
HEAD可以代表一系列文件的状态!!!!
git reset [--mixed] commithash filename
用commithash中filename的内容重置暂存区
### checkout深入理解
git checkout brancname 跟 git reset --hard commithash特别像
共同点
都需要重置 HEAD 暂存区 工作目录
区别
checkout对工作目录是安全的
reset --hard是强制覆盖
checkout动HEAD时不会带着分支走而是切换分支
reset --hard时是带着分支走
checkout + 路径
git checkout commithash filename
重置暂存区
重置工作目录
git checkout -- filename
重置工作目录