git

孤者浪人 提交于 2020-02-09 10:25:59

Git Book
在 Git 里撤销(几乎)任何操作

异同

git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git 更像是把数据看作是对小型文件系统的一组快照。 每次提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。

命令

ssh-keygen -t rsa -C [公钥文件中的备注]: 生成ssh keys

git config --help : 帮助
git config --list :查看所有的git配置
git config --global diff.tool vimdiff :设置全局比对工具

git init : 初始化git本地仓库
git remote add [shortname] [url] : 添加一个新的远程仓库
git remote : 查看远程仓库
git remote -v : 显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote show [remote-name] : 查看某一个远程仓库的更多信息

git add * : 添加所有到暂存区staged
git rm --cached [file-name] 停止追踪一个文件

git status : 文件状态
git status -s : 文件状态short

git commit : 方式会启动文本编辑器以便输入本次提交的说明。只提交暂存区中的文件
git commit -a -m [desc-info] : Git就会自动把所有已经跟踪过的文件暂存起来一并带注释提交,从而跳过 git add 步骤
git commit --amend -m [desc-info] : 补充将暂存区中的文件提交到上次提交的节点中。如果上次提交之后还未做任何修改,快照会保持不变,修改的只是提交信息。

git diff : 比对未暂存的文件差异
git diff --staged / --cached : 比较暂存区文件差异
git difftool --tool-help : 查看支持比对工具
git difftool --tool=vimdiff : 用指定的工具比对

git log --pretty=oneline : 查看提交日志. 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面
git log --oneline --decorate --graph --all : 输出提交历史、各个分支的指向以及项目的分支分叉情况

git branch :当前所有分支的一个列表
git branch [branch-name] : 仅仅创建一个新分支,并不会自动切换到新分支
git branch -d [branch-name] : 删除分支
git branch -a : 列出local 和remote下的所有branch
git branch -v : 查看每一个分支的最后一次提交
git branch -vv : 查看每一个分支的最后一次提交(信息更全)
git branch --merged : 查看哪些分支已经合并到当前分支
git branch --no-merged : 查看所有包含未合并工作的分支
git branch --set-upstream master origin/next 指定master分支追踪origin/next分支

git checkout [branch-name] : 跳转到新本地分支
git checkout -b [branch-name] : 新建一个本地分支并同时切换到那个分支上
git checkout --track [remote-name]/[remote-branch-name] : 从远端拉取新的分支到本地
git checkout -b [branch-name] [remote-name]/[remote-branch-name] : 从远端拉取新的分支到本地并赋予新的本地名称
git checkout [file-name] : 覆盖未在暂存区的文件

git push [remote-name] --delete [remote-branch-name] : 删除一个远程分支
git push [remote-name] [remote-branch-name] : 推送到有写入权限的远程仓库
git push -v --t 大专栏  gitags --set-upstream [remote-name] [remote-branch-name]:[branch-name] 跟踪远程分支

git stash :备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git stash save [desc] : 带注释备份
git stash pop: 应用储藏然后立即从栈上扔掉它。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复
git stash list: 显示Git栈内的所有备份,可以:恢复工作进度利用这个列表来决定从那个地方恢复
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了
git stash apply stash@{2} : 应用其中一个更旧的储藏 如果不指定一个储藏,Git 认为指定的是最近的储藏
git stash drop stash@{0} : 移除的储藏的名字来移除它

git clean : 移除没有忽略的未跟踪文件
git clean -f -d : 移除工作目录中所有未追踪的文件以及空的子目录。 如果只是想要看看它会做什么,可以使用 -n 选项来运行命令,这意味着 “做一次演习然后告诉你 将要 移除什么”。

git reset 还原暂存区
git reset --hard “撤销”提交以及修改内容
git reset 本地的代码库历史返回到指定的 SHA 状态。就像是这些提交从来没有发生过。缺省情况下保留工作目录,提交没有了,但是修改内容还在磁盘上
git revert 会产生一个新的 commit,它和指定 SHA 对应的 commit 是相反的撤销。
git cherry-pick 把撤销过的commit的某一个重新提交到你的代码库里
git reflog 显示的是一个 HEAD 发生改变的时间列表 ( 不会永远保持,Git 会定期清理那些 “用不到的” 对象)

git rebase [basebranch] [topicbranch] : 直接将特性分支变基到目标分支(git rebase master server)
git rebase –continue : 继续直到完成
git rebase –abort : 放弃
git rebase –skip : 直接用topicbranch分支的取代basebranch分支的

git checkout master –> git merge iss53 : iss53 merge到master上。将两个分支的末端所指的快照以及这两个分支的工作祖先,做一个简单的三方合并。
git checkout iss53 –> git rebase master : iss53 rebase到master上。 首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。

git fetch origin branch1:branch2 :首先执行上面的fetch操作,使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支, 如果本地存在branch2分支, 并且是`fast forward’, 则自动合并两个分支, 否则, 会阻止以上操作.
git fetch origin :branch2 等价于: git fetch origin master:branch2

Tag

两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支,它只是一个特定提交的引用。附注标签是存储在Git数据库中的一个完整对象。
git tag : 在控制台打印出当前仓库的所有标签
git tag -a [tag-name] -m “[tag-desc]” : 参数a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。
git tag -a [tag-name] [commit-node-id] : 补打标签
git tag -d [tag-name] : 删除本地标签
git show [tag-name] : 查看标签的版本信息
git push [remote-name] [tage-name] : 将标签提交到git服务器
git push [remote-name] : -–tags 将本地所有标签一次性提交到git服务器
git push origin   :refs/tags/[tage-name] : 推送一个空tag到远程tag

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!