git reset, git checkout, git revert 区别 (译)
Git快速上手精华梳理:https://juejin.im/post/59bcc2f76fb9a00a652af631
https://blog.zengrong.net/post/1746.html
Git帮助命令:
git [command] -h
git help [command]
- 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
- 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。
- Git保证完整性:Git 中所有数据在存储前都计算校验和,然后以校验和来引用。Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。SHA-1 哈希看起来是这样:24b9da6552252987aa493b52f8696cd6d3b00373。实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
- Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。
- Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git 。
- 如果A分支是基于master分支上拉取的,且A分支和master分支均有新提交,此时如果使用git merge的话将会产生新的commit信息。(如:merge branch a)
Git 常用命令
history 查看历史输入命令
echo 'Hello' > README 将'Hello'输出到README文件中
git config --global user.name "xujiangjun"
git config --global user.email "jiangjun.xu@tqmall.com"
git branch 查看本地所有分支
git branch -r 查看远程所有分支
git branch -a 查看本地与远程所有分支
git branch -vv 查看本地与远程分支的关联(本地跟踪的远程分支)
git branch -m oldBranchName newBranchName 重命名分支
git fetch -p 清理远程已经失效的分支
git add [.|*|**/filename.java] 可以使用ant通配符add指定类型文件
git add -f web.xml 如果一个文件格式已经在gitignore中,如需加入暂存区,需要使用-f选项
git commit -m "设置提交信息" 将暂存区内容提交到本地仓库
git commit -am "设置提交信息" 拥有git add 和 git commit -m 的功能
git commit --amend -m "设置提交信息" 修复最近一次Commit
git checkout master 切回到master分支(当有文件修改且未提交时切换分支,成功切换分支后文件的修改会被应用到该分支)
git checkout -f master 强制切回到master分支(当有文件修改且未提交时切换分支,成功切换分支后文件的修改不会被应用到该分支)
git branch -D erp-bugfix-160426-xujj 删除本地分支
git push origin --delete erp-bugfix-160426-xujj 删除远程分支
git checkout -b erp-bugfix-160426-xujj 从当前分支新建本地分支
git push -u origin erp-bugfix-160426-xujj 推送本地分支到远程(远程新建该分支,且设置关联关系)
git checkout test-0505 根据远程分支创建本地分支并建立跟踪,本地创建test-0505分支
git checkout -b test origin/test-0505 根据远程分支创建本地分支并建立跟踪,本地创建test分支
git checkout --track origin/test-0505 根据远程分支创建本地分支并建立跟踪,本地创建test-0505分支
git branch -u origin/test-0505 将当前分支设置跟踪远程分支test-0505
stash@{0} 最近一次隐藏
git stash 隐藏文件的变化
git stash save "设置隐藏信息" 隐藏文件变化,作用于git stash一致
git stash branch <branchname> [<stash>] 将某次stash检出为一个新分支,隐藏被恢复,同时stash list中该stash被drop ,检出为新分支,适合当恢复隐藏时出现冲突时使用
git stash drop [<stash>] 删除某次隐藏文件
git stash clear 删除所有隐藏历史
git stash pop 恢复隐藏的变化(最近一次的stash,即stash@{0}),且将其从栈中删除(栈:后进先出)
git stash apply 恢复某次的隐藏变化,不将其从栈中删除
建议:如果对应的git stash list列表中有多条记录且不清楚文件变化,则推荐使用IDEA中的可视化操作查看文件变化
git reset --hard 回退到上一个版本
git reset --hard HEAD^ 回退到上一个版本
git reset --hard HEAD~100 回退到前100个版本
git reset --hard 108495b060dc5432c4fbe8222769dfa4b9b62bb9 回退到指定的某次提交
git reflog 当回退版本后git log 命令无法查看到最新的那个版本,可以使用该命令查看
警告:如果进行了版本恢复,则必须使用git push --force命令强制推送到远程,另外协同开发的人如果有最新的代码,
则需要进行分支删除,然后重新拉取分支(注意:版本回退后,如果删除远程分支后,再推送远程分支,这样是无效的,别人拉取的代码还会是最新的代码)
git revert 108495b060dc5432c4fbe8222769dfa4b9b62bb9 撤销某次已经提交的更改
Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。
git remote add origin http://dev.tqmall.com/tqmall/saint.git 添加origin仓库
git remote set-url origin [url] 修改origin的指向
git remote show origin 获取远程分支的更多信息
git remote rm origin 删除远程origin仓库
git tag 列出已有的标签,并按字母顺序排序
git tag -l 'xujj*' 按特定模式查找匹配的标签(单引号可以去掉,不去掉也可以)
git show v2.0 显示v2.0信息
git tag -a v2.0 -m '2.0版本' 打一个附注标签,标签名为v2.0
git tag v2.1-lw 打一个轻量标签,不需要加-a -m -s 等选项
git tag -a v2.5 9fceb02 对过去提交打标签,即对9fceb02这次提交打个Tag
git tag -d v2.5 删除本地v2.5标签
git push origin —delete v2.5 删除远程标签与删除远程分支命令类似
git push origin v2.5 将本地v2.5这个标签push到服务器
git push origin --tags 将本地所有标签(不在服务器上的)push到服务器上
git checkout -b branch_name v2.0 将v2.0这个标签检出到branch_name分支上
git config --global pull.rebase true
不建议使用git log命令,推荐使用IDEA上的可视化工具查看
git log -p -2 最近两次提交的内容差异(推荐使用IDEA查看变化)
git log --stat 可以很方便的查看所有提交修改了哪些文件(推荐使用IDEA查看)
git log [version] --stat 查看某次提交修改了哪些文件
git log --pretty=format:"%h - %an, %ar : %s" 自定义日志输出格式
git log --pretty=format:"%h %s" --graph 图形化定义日志输出格式
存储凭证
git config --global credential.helper store
执行完该命令后,执行git pull输入用户名密码后,将自动保存,此后无需再次输入
执行完后,用户主目录下的.git-credentials文件内容如下:https://{username}:{password}@github.com
IntelliJ IDEA中git的神器show history(可以恢复几分钟或者几天前的误删代码)
推荐新建项目同时新建.gitignore文件,当使用git add * 命令添加所有文件时,会提示已在.gitignore中声明的忽略文件