常用
- git init git 初始化
- git clone https://github.com/wsxx111/thisStudy.git 从远端拉下来
- git status 查看跟踪状态
- git status -s (喜爱简介版本)
- git add readme.txt 添加到暂存区
- git commit -m '新提交' 从暂存区到提交到库存
- git commit -am'新提交' 直接略add过暂存区,提交到库存 (书上不怎么推荐)
- git commit --amend -m '重新提交' 修复上次提交的 ,相当于 git reset head^ 了一下,又重新提交了
查看
- git remote 查看远端仓库名
- git remote -v 查看远端地址
- git remote show origin 查看本地和远端分支信息
日志
- git log 查看日志
- git log -3 查看前3条日志 (分支下的记录,不是所有的)
- git log -s -2 (简单版)
- git log --graph 左边有分支图
- git log --pretty=oneline 版本号一目了然
- git reflog 可以查看所有分支的所有操作记录(包括(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
分支
- git branch 查看本地分支
- git branch -r 查看远程分支
- git branch -a 查看本地和远程分支
- git branch dev 新建未存在的分支dev
- git branch -d test 删除分支test
- git branch -D test 当上面提示:分支有没有合并到当前分支的内容,没法删除时 就需要强制删除了,这个就是强制删除
- git push --delete origin test 删除远端分支test
- git branch -d -r new // 删除远程new分支
- git checkout test 切换到已存在的分支test上
- git checkout -b test 新建并切换test分支上,基于本地创建分支
- git checkout -b dev origin/dev 基于远程分支创建本地分支,注意不能这么写 git checkout -b develop origin develop
- git branch -m | -M oldbranch newbranch // 重命名分支,如果newbranch名字已经存在,需用-M强制重命名
-
当前分支为dev, git checkout master =git checkout dev master 是dev相对于master发生的改变
-
git branch -v // 显示分支信息
-
你在一个分支中工作,但是像获取另一个分支中的某个文件。
git checkout <branch> -- <file>
例如master 有个a.txt文件,现在dev分支上执行 git checkout master -- a.txt
之后,dev分支会多一个a.txt,(是跟踪未add状态)
撤销
- git reset --hard 撤销修改 到未修改的干净状态
- git reset --hard head 与上面一样(对未add命令的和已add未commit的撤销到未add的未修改干净状态)
- git reset --hard 34csdds 撤销到某个版本
- git reset --hard head^ 撤销到未修改的干净状态的上一个提交版本
- git reset --hard head^^ 撤销到未修改的干净状态的上两个提交版本
- git reset --hard head~4 撤销到未修改的干净状态的上四个提交版本
- git checkout -- readme.txt (对未add但修改了,撤销到未修改,对已经add又修改了,撤销到未修改已add状态) 去掉 -- 也是一样的(git checkout readme.txt),但建议带着 避免与切换分支产生分歧就不好了
- git reset (等于 git reset --soft) 或者git reset head 把add暂存区里面的给撤回到未add的工作区中,注意,只是改变状态,没有改变文件里面的内容,而chekout --改变的是内容,不涉及状态
- git reset HEAD readme.txt 撤销某文件,但不能硬撤销某文件,只能软撤销
- git reset --hard 或者git reset --hard head 这个是回复到未修改的工作区,即未add的工作区中,和上面 git reset 还是不一样的,git reset 默认是git reset --soft
合并
- git merge test 把test分支合并到当前分支 (合并前记得切换好分支),可以加 -m 进行解释
- git merge --ff test 和上面一样。 --ff是指fast-forward命令。当使用fast-forward模式进行合并时,将不会创造一个新的commit节点。默认情况下,git-merge采用fast-forward模式。当前分支合并到另一分支时,如果没有分歧解决,就会直接移动文件指针。这个过程叫做fast forward。
例如,开发一直在master分支进行,但忽然有一个新的想法,于是新建了一个develop的分支,并在其上进行一系列提交,完成时,回到 master分支,此时,master分支在创建develop分支之后并未产生任何新的commit。此时的合并就叫fast forward。master在合并develop分支的时候并没有产生新的节点,如果是--no-ff 会生成一个节点
- git merge --no-ff -m '提交合并' 不fast-forward合并
- git merge --abort 该命令仅仅在合并后导致冲突时才使用。git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态
- git merge dev --squash 当一个合并发生时,从当前分支和对方分支的共同祖先节点之后的对方分支节点,一直到对方分支的顶部节点将会压缩在一起,使用者可以经过审视后进行提交,产生一个新的节点。
在看到冲突以后,你可以选择以下两种方式:
决定不合并。这时,唯一要做的就是重置index到HEAD节点。git merge --abort用于这种情况。
解决冲突。Git会标记冲突的地方,解决完冲突的地方后使用git add加入到index中,然后使用git commit产生合并节点。
你可以用以下工具来解决冲突:
使用合并工具。git mergetool将会调用一个可视化的合并工具来处理冲突合并。
查看差异。git diff将会显示三路差异(三路合并中所采用的三路比较算法)。
查看每个分支的差异。git log --merge -p <path>
将会显示HEAD版本和MERGE_HEAD版本的差异。
查看合并前的版本。git show :1:文件名显示共同祖先的版本,git show :2:文件名显示当前分支的HEAD版本,git show :3:文件名显示对方分支的MERGE_HEAD版本。
git merge test 如果有冲突,想撤销就 git reset --hard或者 git reset --hard head 就能还原到未合并前
衍合
- git rebase master 衍合,把 从当前分支和master的最近祖先开始到当前分支的 所有提交节点 合到master之后,就是换基
- rebase介绍
区别
- git diff 当前工作区 与 暂存区 比较 显示add之后的变化
- git diff --cached 或者 git diff --staged 是比较的暂存区与库存head的 ,显示的是如果要commit后,提交的新变化
- git diff head 显示的是当前改变 与库存head的变化,包括 add的和add之后的改变 的汇总
关联
- git clone https://github.com/wsxx111/thisStudy.git 从远端拉下来(从远端到本地的一种关联)
- git remote add origin https://github.com/wsxx111/GGG.git 本地建立一个远端的仓库关联 注意地址要对,可以在github先建一个GGG仓库 (从本地到远端的一种关联)
拉取
- git fetch 这将更新git remote 中所有的远程仓库 所包含分支的最新提交id, 将其记录到.git/FETCH_HEAD文件中,不包括文件
- git fetch origin 这将名称为origin 的远程仓库上的所有branch的最新提交id,将其记录。
- git fetch origin dev 这将这将名称为origin的远程仓库上的分支dev
- git pull origin master 拉取远端到本地,并与本地的东西合并
相当于执行了两步
git fetch origin master 拉取远端到本地,不合并
然后 git merge origin master
这两步就是 git pull origin master 的操作 -
pull即 首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。
推送
- git push -u origin dev 把当前的分支与远段的dev分支关联,一般用于首次推送
或者 git push --set-upstream origin dev 这个也可以 之后的推送就可以使用 git push 就行了,同时更新的时候也可以git pull 或者 git fetch 就行了,因为已经关联了。
也可以git branch --set-upstream dev origin/dev 实现本地和远端的分支关联
- git push origin dev 通用的推送,把当前分支推送到远端的dev分支
其他(不想写了)
- git stash
- git stashlist
- git stash apply
- git stash pop
- git rm test.txt
- git merge --no-ff -m "merged bug fix 101" issue-101
- git remote rm origin 删除远程仓库
- git remote add origin git@github.com:wsxx111/GGG.git
- git tag v1.0
- git tag
- git show v0.9
- git tag -d v0.1 删除一个本地标签
- git push origin v1.0 推送一个本地标签
- git push origin --tags 一次性推送全部尚未推送到远程的本地标签
# 删除 untracked files
git clean -f
# 连 untracked 的目录也一起删掉
git clean -fd
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)
git clean -xfd
# 在用上述 git clean 前,墙裂建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删
git clean -nxfd搜索
git clean -nf
git clean -nfd