基础
创建仓库
两种方式
- 在现有目录中初始化仓库
git init
会创建一个.git
的子目录,含有你初始化的 Git 仓库中所有必须文件。 - 克隆现有的仓库
git clone <url>
暂存修改
git add <filename>
将某个文件放到暂存区
git add .
将所有修改的文件放到暂存区
忽略文件.gitignore
可以创建一个名为 .gitignore
的文件,列出要忽略的文件(即无需纳入 Git 的管理)。比如,包依赖文件等。
分支
git branch
查看本地所有分支
git branch -v
查看本地所有分支的最新提交信息
git branch -vv
信息更详细。所有的本地分支,跟踪的远程分支,领先和落后等信息。
创建分支
git checkout -b <branch>
在本地创建分支并切换到该分支上
等价于
git branch// 先创建分支git checkout //再切换分支复制代码
本地分支到远程
git push --set-upstream origin或git push -u origin 复制代码
注意
- 在哪个分支上创建的,内容就是基于那个分支的。
删除分支
git branch -d <branch>
删除本地分支
git push origin --delete <branch>
删除远程分支
合并分支
git merge <branch>
将分支合并到当前分支上
合并模式
fast-forward
子分支如果能够指向主分支的最新 commit ,那么合并时只是直接将主分支的指针指向子分支的罪行 commit。(原因是这类情况不需要解决冲突)
变基(Rebasing)
相当于将在分支上提交的改变,在另一个分支上重新进行一遍。
普通情况
-
先切到待合并的分支
git checkout experiment
-
指定当前分支变基到主分支
git rebase master
rebase
会先找到两个分支的公共祖先,然后对比二者提交的差别,然后相当于将待合并的分支的提交在主分支的提交基础上重新依次提交一遍。即待合并的分支还在,只是祖先变成主分支的最新提交处。 -
切换到主分支
git checkout master
-
将变基后的分支合并到主分支上
git merge experiment
此时的合并就相当于
fast-forward merge
。
将多个commit合并为一个
git rebase -i master
- 保留第一个 commit 为 pick,其余为 f,此时将第一个 commit 的内容修改最合适的说明。(注意第一个不能为 pick)
- 如果有冲突,解决冲突 3.1. 然后
git add .
(注意不再需要 git commit) 3.2.git rebase --continue
git checkout master
git merge issue
信息
git status
查看文件状态
git status -s
(简短方式显示信息)
git log
查看提交历史
git show commitId
查看某次提交的具体信息
git show <branch>
查看一个分支的最后一个提交
git reflog
查看近期的 HEAD 和分支引用所指向的历史
HEAD
HEAD^
指向上一个提交,即“HEAD 的父提交”
HEAD^n
表示上 n 个提交
commitId^
commitId^n
更新
拉取
git fetch
指令会从服务器拉取本地没有的变化,但不会修改工作目录的内容。需要自己进行合并。git pull
指令相当于在拉取并进行合并。
暂存
有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态,而这时你想要切换到另一个分支做一点别的事情。问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。
常用
git stash
会将修改保存到一个栈上,可以在任何时候重新应用这些改动。
git stash list
查看存储在栈上的修改。
git stash apply
应用最近的储藏。(不会移除该储藏)
git stash apply stash@{n}
指定应用的储藏。(不会移除该储藏)
git stash drop stash@{n}
移除指定的储藏。
git stash pop
应用顶层储藏并将其从栈上移除。
更多
git stash -u / git stash --include-untracked
会储藏包括任何创建的未跟踪文件
标签
git tag -i
查看所有标签
git tag -a <tagname>
创建标签
git tag -d <tagname>
删除本地标签
git push origin --delete tag <tagname>
删除远程标签
git push origin :refs/tags/<tagname>
删除远程标签