新建代码库
# 初始化当前目录为git代码库
git init
# 创建目录并初始化git代码库,即该目录下的文件将被git管理
mkdir 目录名称 && cd $_ && git init [project-name]
下载项目
git clone <项目URL> <本地目录>
git clone <项目URL> #默认包含全部代码历史
git clone --depth=1 <项目URL> #只包含最新的提交记录
git clone -b <branch-name> --single-branch <项目URL> # clone 下来指定的单一分支
git fetch
将远程分支的更新,全部/分支 取回本地仓库(Repository),不会影响工作目录和暂存区
git pull
拉取远程分支的更新,再与本地的指定分支合并(相当与fetch加上了合并分支功能的操作)
git push
将本地分支的更新,推送到远程主机,其命令格式与 git pull 相似
新增/修改/删除/查看状态/对比/重命名 文件
# 工作区的文件添加到暂存区(新文件或修改后都需要add到暂存区)
git add <filename> <filename> ...
# 添加指定目录(包括子目录)到暂存区
git add <dirname>
# 把工作区当前目录及子目录的所有新增(new)以及修改(modified)提交到暂存区, 但不包括被删除的文件。
git add .
# 把工作区当前目录及子目录的所有被修改的文件提交到暂存区。
git add -u
# 是上面两个功能的合集(git add --all的缩写)
git add -A
# 查看工作区文件新增修改删除状态
git status
# 显示工作区和暂存区的不同
git diff
# 查看指定文件工作区与暂存区的不同
git diff <filename>
# 显示暂存区、工作区和最近版本的不同
git diff HEAD
# 显示本地仓库中任意两个 commit 之间的文件变动
git diff <commit-id> <commit-id>
# 显示暂存区和最近版本的不同
git diff --cached
# git diff HEAD -- readme.txt # 查看工作区readme.txt和版本库里面最新版本readme.txt的区别
# 删除工作区文件,并把此操作记录保存到暂存区
git rm <file1> <file2> ...
# 停止追踪指定文件(不受git管理), 该文件不会从工作区删除
git rm --cached <file>
# 文件改名,并把此操作记录保存到暂存区
git mv <file-oldname> <file-newname>
提交暂存区文件到本地仓库
# 提交到本地仓库 (把暂存区的所有操作一次性提交到本地仓库当前分支, 会生成一个版本号)
git commit -m "备注信息"
# 提交指定文件...
git commit <file1> <file2> <file3> ... -m "备注信息"
# 提交工作区自上次commit之后的变化,直接提交到本地仓库
git commit -a
# 提交时显示所有diff信息
git commit -v
# 重新提交(覆盖上一次的commit)
git commit --amend [file1] [file2] ... -m "备注信息"
查看信息
git log # 显示从最近到最远的**提交**的日志
git log [-n] --pretty=oneline # 美化格式: 提交版本号id 提交时的备注信息,最近n此提交
git log -p <file> # 显示指定文件每一次提交具体差异
git log --stat # 显示commit历史,以及每次commit发生变更的文件
git log --graph 树形状提交记录,可查看分支合并信息
git log -S <keyword> # 根据关键词,搜索提交历史
git log --follow <file> #git whatchanged <file> # 显示某个文件的版本历史
git shortlog -sn # 显示所有提交过的用户,按提交次数排序
git blame <file> # 显示指定文件是什么人在什么时间修改过
git show --name-only <commit> # 显示某次提交的元数据和内容变化
git show <commit>:<file> # 显示某次提交时,某个文件的内容
git reflog # 显示当前分支的最近几次提交
# git reflog可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
# 例如执行 git reset --hard HEAD~1,退回到上一个版本
# 用git reflog则可以看到被删除的commit,用git log则是看不到被删除的commit
# 然后 git reset --hard commit 我们就可以恢复到被删除的那个版本
对比差异
git diff # 显示工作区和暂存区的差异
git diff --cached [file] # 显示指定文件暂存区和上一版本的差异
git diff HEAD [file] # 显示工作区与当前分支最近提交版本的差异
git diff --shortstat "@{0 day ago}" # 显示今天你写了多少行代码
撤销
git checkout <file> # 恢复这个文件到最近一次或git add或git commit时的状态
git checkout . # 恢复当前目录所有文件内容到最近一次或git add或git commit时的状态
git checkout <commit> <file> # 恢复指定文件到指定版本。相当于把工作区的内容修改到指定版本的文件内容后,再把修改的内容添加到暂存区。
git reset <file> # 重置暂存区的指定文件,与上一次commit保持一 致,但工作区不变
git reset --hard # 重置暂存区与工作区,与上一次commit保持一致
git reset <commit> # 重置当前分支的指针为指定commit, 同时重置暂存区,但工作区不变
git reset --hard <commit> # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --keep <commit> # 重置当前HEAD为指定commit, 但保持暂存区和工作区不变
git reset --hard HEAD^ # 回退到上一个版本
git reset --hard HEAD^6 # 回退到上上个版本,以此类推
git reset --hard HEAD~100 # 回退到前100个版本
git reset --hard <commit> # 回退到指定版本号(前几位,只要可以唯一识别)
git revert <commit_id> # 新建一个commit, 用来抵消指定commit造成的变化
Git暂存管理
# 暂存当前分支的变化,之后再恢复
git stash ==> git stash pop
git stash # 暂存
git stash list # 列所有stash
git stash apply # 恢复暂存的内容
git stash drop # 删除暂存区
git stash clear
分支
-
查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
-
显示本地所有分支
git branch
-
显示远程所有分支
git branch -r
-
显示本地以及远程所有分支
git branch -a
-
新建本地分支
git branch <branck>
-
本地分支关联到远程分支
git branch --set-upstream <local_branch> origin/<remote_branch>
例子:git branch --set-upstream master origin/master
-
新建本地分支,并关联到远程分支
git branch --track <local_branch> origin/<remote_branch>
-
以当前分支为蓝本新建分支并切换到新分支
git checkout -b <branch>
-
以远程分支为蓝本新建分支并切换到新分支
git checkout -b <branch> origin/<remote_branch>
-
新建远程分支,其实就是将本地分支推送至远程
git push origin <local_branch>:<remote_branch>
-
重命名本地分支
git branch -m <new-branch-name>
-
切换到指定分支,并更新工作区
git checkout <branck>
-
切换回上一个分支
git checkout -
-
删除分支
git branch -d <branch> # 删除某个分支
git branch -D <branch> # 强制删除某个分支
-
删除远程分支
git push origin --delete <remote_branch>
git branch -dr <remote/branch>
git push origin :<remote_branch> # 推送了一个空的分支到远程覆盖了原来的远程分支
-
合并指定分支到当前分支
git merge <branch>
-
衍合指定分支到当前分支
git rebase <branch>
-
选择一个commit, 合并进当前分支
git cherry-pick <commit>
标签
# 查看tag
git tag # 查看所有tag
git show <tag_name> # 查看指定tag
# 查看标签详细信息
git tag -ln
# 新建tag
git tag <tag_name> # 基于最新提交创建标签
git tag -a <tag_name> -m "tag_msg" # 附注标签
git tag -a <tag_name> <commint_id> # 给某次提交添加标签
# 删除tag
git tag -d <tag_name>
# 提交某个tag到远程
git push origin <tag_name>
# 推送全部未推送过的本地标签 到远程
git push origin --tags
# 新建一个分支, 指向某个tag
git checkout -b <branch> <tag>
# 显示当前分支的最近的 tag
git describe --tags --abbrev=0
# 删除远程分支或标签
git push <remote> :<branch/tag-name>
远程操作
# 显示所有远程仓库
git remote -v
# 显示某个远程仓库的信息
git remote show [ remote ]
# 重命名远程仓库:
git remote rename demo test
# 从远程仓库克隆
git clone git@github.com:xxx/xxx.git
# 获取远程其他分支
git checkout -b dev origin/dev
# 更改远程仓库的 url
git remote set-url origin <URL>
# 抓取远程仓库所有分支更新并合并到本地
git pull
# 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git pull --no-ff
# 抓取远程仓库的所有变动
git fetch origin
# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
# 本地目录添加远程库
git remote add <名称> <远程库地址>
git clone <远程库地址> <名称> #不需要git init
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
git push [ remote] --force
# 推送所有分支到远程仓库
git push [ remote] --al1
# 强制远程覆盖本地
git fetch --all
git reset --hard origin/<remote_branch_name>
# 推送分支(会推送到远程对应的分支上)
git push <远程主机名> <本地分支名>:<远程分支名> 若省略远程分支,代表将本地当前分支推送到远程对应分支
git push origin master #推送到远程的master
git push origin dev #推送到远程的dev
合并衍合
git rebase master feature_a # 将master rebase到分支feature_a,前提是feature_a没有push过
# 合并分支
git checkout master # 切换到主分支
git merge dev #把dev分支合并到当前分支
解决冲突
# 假如在dev分支上修改了readme并且已commit提交,master分支上也修改readme,并且修改了同一行,也commit提交了,
那么 在master执行git merge dev 会报错
# 手动解决冲突代码,然后add
# 撤销某一次合并
git revert <merge_commit_id> -m number
# git pull --rebase有冲突后,解决冲突,使用 git add .然后使用git rebase --continue
# 切换到某个分支,将其他分支的某次提交应用到该分支
git checkout <branch_name>
git cherry-pick <commit id>
# 前者(左开右闭,不包含start-commit_id)的提交cherry-pick到当前分支;到后者之间(闭区间,包含start-commit_id)的提交cherry-pick到当前分支。
git cherry-pick <start-commit_id>..<end-commit_id>
git cherry-pick <start-commit_id>^..<end-commit_id>