配置git
git config --global user.name/user.email
// 配置级别
--local // 默认,高优先级,只影响本仓库
--global // 中, 影响到当前用户的所有git仓库
--system // 低, 影响全局git 仓库
初始化仓库
git init [[path]/ [path]--bare]
基本操作
git status // 对状态的跟踪 内容状态:工作目录/ 暂存区/提交区 文件状态: 未跟踪/已跟踪
git add // 添加文件到暂存区(同时文件被跟踪)
git add . // 他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u // 他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A // 是上面两个功能的合集(git add --all的缩写)
git rm // 删除
-- cached // 仅从暂存区删除
--f // 从暂存区与工作目录删除
git rm $(git ls-files --deleted) // 删除所有被跟踪,但是在工作目录被删除的文件
git ls-files // 展示所有被跟踪的文件
git checkout -- <file> // to discard changes in working directory(撤销工作目录的修改,缓存区内容覆盖工作目录)
git reset HEAD <file> // to unstage (撤销暂存区内容, 即暂存区被提交区内容覆盖)
git checkout HEAD -- <file> // 提交区的内容覆盖暂存区和工作目录,即撤销所有修改到上次commit
git commit // 提交到 提交区
-m 'message' // 提交时的message
-a -m'message' // 直接从工作目录提交到提交区
-m"message" -n // m:message, n :no-verify
git-log // 查看提交的历史记录
--oneline // 简短记录,一行
git 中别名的设置
git config alias.<shortname> '<fullcommand>' // 为fullcommand 配置别名shortname
// eg:
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
"
显示工作目录与暂存区的差异
git diff // 工作目录与暂存区的差异
git diff -cached [<reference>] // 暂存区与某次提交差异,默认为HEAD
git diff <reference> // 工作目录与某次提交的差异
忽略文件
.gitignore //在添加时忽略匹配文件,仅作用于**未跟踪**的文件
分支管理
git branch // 分支的增删改查
git branch <branchName> // 查看分支
git branch -a // 查看本地和远程分支
git branch -m "daily/0.0.1" // 在本分支修改名字
git branch –d <branchName> // 如果是要删除本地已经合并了的分支
git branch –D <branchName> // 如果是要删除本地未合并的分支
git branch -v 显示所有分支信息
git checkout <branchName> 通过移动HEAD检出版本,切换分支
git checkout -b <branchName> 创建分支,并切换到该分支
git checkout -b <branchName> origin/<branchName> 以origin/branchName 为基础创建分支并切换到该分支
git fetch origin <origin branchName>:<local branchName> // 使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
git reset -将当前分支会退到历史某个版本
git reset --mixed <commit> // (默认), 把分支(branch&HEAD)移动到 commit, 且把暂存区内容替换为commit
git reset --soft <commit> // 暂存区和工作目录不改变
git reset --hard <commit> // 且把暂存区和 工作目录都用commit内容替换掉
// reset 捷径
A^ // A的上一次提交
A~n // A之前的第n次提交
// eg:
git reset HEAD^
git reset HEAD~5
git reset HEAD 撤销 add .到add 前。
git reset --hard HEAD^ 撤销到commit的上一次,如果要撤销到上99次,可以用 git reset --hard~99;
git reset --hard 9425c47b6 //版本号
git reflog // 查询所有提交log,包括回退前的版本
git stash // 保存当前的暂存区和工作目录到git stash 栈中,并从最近的一次提交中读取相关内容,让暂存区和工作目录保持clean,从而可以切换分支等一系列操作。
git stash save 'message' // 同 git stash 并增加 message,便于理解保存内容
git stash pop: 从Git stash栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash apply stash@{0} // 让保存的stash@{0} 中的内容从新回到工作目录和暂存区
git stash drop stash@{0} // 删除git stash栈中的stash@{0}内容
git stash list: 显示Git stash栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。
git merge // 合并分支, 默认为 fast-forward合并
git merge branchA // 把branchA 合并到当前分支
git merge branchA branchB // 把branchA合并到branchB
git merge --no-ff branchA // 合并分支,并保留分支的合并信息
git cat-file -p HEAD|| branch|| commitHash // 查看具体分支的详细信息 -p 参数为 'Pretty-print the contents of object based on its type.'
reset vs checkout
reset 与checkout命令对比图rebase 变基
git rebase branchA// 检修提交历史基线,使合并的分支branchA成为线性
git rebase -- onto branchA commitId // 同上,只不过合并了commitId,而不是本分支的所有内容。
尽量不要在共有分支上使用rebase,因为rebase会从新生成commitID会导致你本地的部分commidId和队友的不同,从而造成没必要的冲突
git rebase
while(存在冲突) {
git status
找到当前冲突文件,编辑解决冲突
git add -u
git rebase --continue
if( git rebase --abort ) 如果rebase过程中,你想中途退出,恢复rebase前的代码则可以用命令
break;
}
使用git rebase合并多次commit
1.首先使用git log查看一下提交历史
2. git 压缩 git rebase -i HEAD~4
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase
使用别名
git tag tagName branch || commitId // 把 此时此刻的branch 或者commitId 打上名为tagName 的tag
git tag -l // 列出tag的list
git push origin tagName // 把tag推到origin
创建本地远程提交仓库
git init [path] --bare // --bare 表示为裸仓库,是因为这个仓库只保存git历史提交的版本信息
远程提交
源仓库和远程仓库合并
git remote -v 查看远程主机状态
git remote rm origin 删除远程仓库
git remote add upstream git@github.com:xxx/xxx.git 添加源仓库地址
git fetch upstream 从源仓库更新同步代码
git merge upstream/master 合并到本地代码
git push 向自己远程仓库推送刚才同步源仓库后的代码
git fetch // 本地更新远程同步
$ git push origin newBranch // 把分支同步到远程,如果远程没有该分支,直接创建一个(但是前提是local分支名字要和远程相同)
git push origin --delete thisBranch // 删除远程分支
git clone // 克隆一个远程仓库
gid
网友评论