GIT的实用技巧专栏

MedusaSorcerer的博客


专栏目录

专栏详情

GIT介绍

Git ( git-scm.com/ ) 是开源的分布式版本控制系统, 是 Linus Torvalds 为帮助开发人员而设计的软件系统, 在开发人员中大部分会选择Git做为你的代码管理工具。python

  • 分支: 从主分支(master)上分离出来的子分支, 从而进行不影响master分支的操做
  • 合并: 你在子分支的修改须要归并到master的时候就须要将分支合并
  • 冲突: 在不一样分支对同一文件修改提交后合并会产生冲突, 须要手动解决, 具体体现是在文件内容冲突的地方写入内容差别
  • 仓库: 仓库是你提交代码后保存代码的地方, 咱们会有远程仓库和本地仓库之说

GIT差别

Git和其余版本控制系统的主要差异在于Git只关心文件数据的总体是否发生变化, 而大多数其余系统则只关心文件内容的具体差别, 这类系统(CVS | Subversion | Perforce | Bazaar...)每次记录有哪些文件做了更新以及更新的内容。 git

Git并不保存这些先后变化的差别数据, 而Git更像是把变化的文件做快照后记录在一个内置文件系统中, 每次提交更新时它会纵览全部文件的指纹信息并对文件做快照, 而后保存一个指向此次快照的索引, 若文件没有变化, 仅仅是保存上次的快照连接。 算法

在Git中的绝大多数操做都只须要访问本地文件和资源而不用链接网络, 但若是用CVCS的话, 差很少全部操做都须要链接网络, 由于Git在本地磁盘上就保存着全部当前项目的历史提交, 因此处理速度极快。 数据库

数据在保存到Git以前, 全部数据都要进行内容的校验和计算(checksum), 并将此结果做为数据的惟一标识和索引, 换句话说, Git不可能在你修改了文件或目录以后对此一无所知。 这项特性做为Git的设计哲学, 建在总体架构的最底层, 因此若是文件在传输时变得不完整或者磁盘损坏致使文件数据缺失时Git都能当即察觉。 而Git使用 SHA-1 算法计算数据的校验和, 经过对文件的内容或目录的结构计算出一个SHA-1哈希值, 做为指纹字符串, 该字串由 40 个十六进制字符(0-9 | a-f)组成, 实际上全部保存在Git数据库中的东西都是用此哈希值来做索引的, 而不是靠文件名。 安全

对于任何一个文件, 在Git内都只有三种状态:服务器

  • 已提交 (committed): 表示该文件已经被安全地保存在本地数据库中
  • 已修改 (modified): 表示修改了某个文件但尚未提交保存
  • 已暂存 (staged): 表示把已修改的文件放在下次提交时要保存的清单中

由此咱们看到Git管理项目时, 文件流转的三个工做区域: 工做目录 | 暂存区域 | 本地仓库 网络

官网原文点击此处查看架构

GIT命令

在三个工做区的基础上, 咱们实际还有一个 远程仓库区, 跟本地仓库同样, 只是仓库位置从本机拓展到了远程服务器上。 app

Command Descriptions
git add -i 打开一个交互式界面按需求添加文件
git add -p 对同一个文件的多处变化分次提交
git add -u 将本地的(修改, 删除, 没有新增)文件添加到暂存区
git add .
git add -A
添加当前目录的全部文件到暂存区
git add [DirName] 添加指定目录到暂存区
git add [FileName] ... 添加指定文件到暂存区
git archive 生成一个可供发布的压缩包
git blame [FileName] 显示指定文件是什么人在什么时间修改的信息
git branch --set-upstream [Branch] [RemoteBranch] 创建追踪关系, 在现有分支与指定的远程分支之间
git branch --track [Branch] [RemoteBranch] 新建一个分支, 与指定的远程分支创建追踪关系
git branch -a 列出全部分支
git branch -d [Branch] 强制删除分支
git branch -m [OldName] [NewName] 本地分支重命名
git branch -r 列出全部远程分支
git branch [Branch] [Commit] 新建一个分支, 指向指定commit
git branch [Branch] 新建一个分支, 但不切换
git branch 查看本地全部分支
git checkout - 切换到上一个分支
git checkout --track origin/dev 切换到远程dev分支
git checkout -b [Branch] [tag] 新建一个分支, 指向某个tag
git checkout -b [Branch] 新建一个分支, 并切换到该分支
git checkout . 恢复暂存区的全部文件到工做区
git checkout [Branch] 切换到指定分支, 并更新工做区
git checkout [Commit] [File] 恢复某个commit的指定文件到暂存区和工做区
git checkout [FileName] 恢复暂存区的指定文件到工做区
git checkout [BranchName] 切换分支
git cherry-pick [CommitID] 用于把另外一个本地分支的commit修改应用到当前分支
git clone [URL] 克隆对应项目URL的代码到本地
git commit --amend -m [message] 代码没有任何新变化, 则改写上一次commit的提交信息
git commit --amend [file1] [file2] ... 重改上一次commit, 并包括指定文件的新变化
git commit -a -v 通常提交命令
git commit -a 提交当前repos的全部的改变
git commit -am [message] 提交工做区变化的文件直接到仓库区, 并添加提交描述信息
git commit -m [message] 提交暂存区到仓库区, 并添加提交描述信息
git commit -v 提交时显示全部diff信息
git commit [file1] [file2] ... -m [message] 提交暂存区的指定文件到仓库区, 并添加提交描述信息
git commit 提交
git config --global alias.ci commit
git config --global alias.co checkout
设置git命令的别名
git config --list 显示Git配置
git config -e [--global] 编辑Git配置文件
git config -l 查看当前配置
git config [--global] user.name "[userName]"
git config [--global] user.email "[email]"
设置用户信息
git diff --cached [file] 显示暂存区和上一个commit的差别
git diff --cached
git diff --staged
查看还没有提交的更新
git diff --shortstat "@{0 day ago}" 显示今天你写了多少行代码
git diff --staged 查看暂存起来的文件(stage)与并未提交(commit)的差异
git diff --stat 查看显示简略结果(文件列表)
git diff HEAD 显示工做区与当前分支最新commit之间的差别
git diff [first-branch]...[second-branch] 显示两次提交之间的差别
git diff 显示暂存区和工做区的差别
git fetch [remote] 下载远程仓库的全部变更
git fetch 从远程获取最新版本到本地, 不会自动merge
git init [dirName] 新建一个目录并初始化为Git本地仓库
git init 在当前目录建立一个Git本地仓库
git log --follow [file]
git whatchanged [file]
显示某个文件的版本历史, 包括文件更名
git log --graph 显示什么时候出现了分支和合并等信息
git log --oneline 一行显示一条log
git log --stat 显示commit历史, 以及每次commit发生变动的文件
git log -3 查看前3次修改
git log -N --pretty --oneline 显示过去N次提交
git log -S [keyword] 搜索提交历史, 根据关键词
git log -p [file] 显示指定文件相关的每一次diff
git log -p 查看详细修改内容
git log [tag] HEAD --grep feature 显示某个commit以后的全部变更, 其"提交说明"必须符合搜索条件
git log [tag] HEAD --pretty=format:%s 显示某个commit以后的全部变更, 每一个commit占据一行
git log 显示当前分支的版本历史
git ls-files 看已经被提交的
git merge --abort 尽可能回退到merge前的状态(可能会失败)
git merge --no-ff <branch_name> 采用no fast forward的合并方式, 这种方式在合并的同时会生成一个新的commit
git merge --squash <branch_name> 将目标分支合并过来但不携带commit信息, 执行后最后须要提交一个commit
git merge [branch] 合并指定分支到当前分支
git mv [file-original] [file-renamed] 修改文件名, 而且将这个更名放入暂存区
git pull --rebase 暂存本地变动, 合并远程最新改动, 合并刚刚暂存的本地变动(不产生无用的merge的同步)
git pull [remoteName] [localBranchName] 拉取远程仓库
git pull origin --tags 合并远程仓库的tag到本地
git pull 从远程获取最新版本并merge到本地
git push --all origin 将全部本地分支都推送到origin主
git push -f origin -f强推, 在远程主机产生一个"非直进式"的合并(non-fast-forward merge)
git push -u origin master -u指定origin为默认主机, 后面就能够不加任何参数使用git push了
git push [remoteName] --delete [branch]
git branch -dr [remote/branch]
删除远程分支
git push [remoteName] :refs/tags/[tagName] 删除远程tag
git push [remoteName] [localBranchName] 推送远程仓库
git push [remote] --all 推送全部分支到远程仓库
git push [remote] --force 强行推送当前分支到远程仓库, 即便有冲突
git push [remote] --tags 提交全部tag
git push [remote] [branch] 上传本地指定分支到远程仓库
git push [remote] [tag] 提交指定tag
git push origin --tags 上传本地tag到远程仓库
git push origin :heads/[name]
git push origin :[name]
删除远程分支
git push origin :refs/tags/[name] 删除远程版本
git push origin master:hb-dev 将本地库与服务器上的库进行关联
git rebase --abort 终止rebase, 分支会回到rebase开始前的状态
git rebase --continue 执行rebase出现冲突解决后, 执行该命令会继续应用(apply)余下的补丁
git rebase --skip 跳过当前提交
git reflog 显示当前分支的最近几回提交
git remote -v 显示全部远程仓库
git remote add [shortname] [url] 增长一个新的远程仓库, 并命名
git remote rm [name] 删除远程仓库
git remote set-url --push [name] [newUrl] 修改远程仓库
git remote show [remote] 显示某个远程仓库的信息
git remote show 查看远程库
git reset --hard [commit] 重置当前分支的HEAD为指定commit, 同时重置暂存区和工做区, 与指定commit一致
git reset --hard 完全回退到某个版本, 替换暂存区和工做区, 本地的源码也会变为上一个版本的内容
git reset --keep [commit] 重置当前HEAD为指定commit, 但保持暂存区和工做区不变
git reset --mixed 同不带任何参数的git reset同样, 重置暂存区, 但不改变工做区
git reset --soft HEAD~3 引用回退三次(工做区不变, 暂存区不变)
git reset --soft 回退到某个版本, 不改变暂存区和工做区(若是还要提交, 直接commit便可
git reset HEAD HEAD 效果同上, 由于引用重置到HEAD至关与没有重置
git reset HEAD^ 引用回退一次(工做区不变, 暂存区回退)
git reset [commit] 重置当前分支的指针为指定commit, 同时重置暂存区, 但工做区不变
git reset [file] 重置暂存区的指定文件, 与上一次commit保持一致, 但工做区不变
git reset 将以前用git add命令添加到暂存区的内容撤出暂存区(至关于git add -A 的反向操做)
git revert -n HEAD 撤销上一次但不commit
git revert -no-edit HEAD 撤销上一次并直接使用默认注释
git revert HEAD 撤销上一次commit
git revert [commit] 新建一个commit, 用来撤销指定commit
后者的全部变化都将被前者抵消, 而且应用到当前分支
git rm --cached [file] 中止追踪指定文件, 但该文件会继续保留在工做区
git rm -r [floder] 删除文件夹
git rm [file1] [file2] ... 删除工做区文件, 而且将此次删除操做放入暂存区
git shortlog -sn 显示全部提交过的用户, 按提交次数排序
git show --name-only [commit] 显示某次提交发生变化的文件
git show [commit] 显示某次提交的元数据和内容变化
git show [commit]:[filename] 显示某次提交时, 某个文件的内容
git show [tag] 查看tag信息
git stash apply 恢复最新保存工做进度, 但不删除
git stash clear 删除全部
git stash drop 删除一个进度, 默认删除最新的
git stash list 显示进度列表
git stash pop 恢复最新保存的工做进度, 并将恢复的工做进度从存储的列表中删除
git stash push 将文件给push到一个临时空间中
git stash save "message" 保存进度加说明
git stash 保存当前的工做进度
git status --ignored 显示被忽略的文件
git status -s 将结果以简短的形式输出
git status 查看当前状态
git submodule add [url] [path] 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git tag -a [name] -m 'yourMessage' 建立带注释的tag
git tag -d [tag] 删除本地tag
git tag -r 查看远程版本
git tag [name] 建立版本
git tag [tag] [commit] 新建一个tag在指定commit
git tag [tag] 新建一个tag在当前commit
git tag 列出全部tag
git version 获取git版本

常见错误

认证失败
# 方案一
git config --system --unset credential.helper

# 方案二
->  win+R 打开命令窗口
->  输入 control
->  用户帐户
->  管理你的凭据
->  Windows凭据
-> 找到Git地址的对应凭据修改帐户密码
复制代码
相关文章
相关标签/搜索