安装 git 当前用户的 Git
配置文件放在用户主目录下的一个隐藏文件 .gitconfig
中,里面可配置 git
相关的全局信息。
安装好后,最后一步设置 1 2 3 git config --global user.name "korey" git config --global user.email "xxx@163.com" git config --global alias.st status
大小写敏感 1 git config core.ignorecase false
如果已经在远程仓库出现文件重复的情况
git config core.ignorecase false
修改文件夹名称为目标名称,然后 push
,远程仓库出现文件重复的情况。
git rm --cached src/components/Header -rf
再次 add->commit->push
即可
列举所有配置
查看系统 config 1 git config --system --list
查看当前用户(global)配置 1 git config --global --list
查看当前仓库配置信息 1 git config --local --list
删除某个配置 1 git config --global --unset user.emaill
全局的通过 vim ~/.gitconfig
来查看 局部的通过当前路径下的 .git/config
文件来查看
创建版本库(仓库) 1 2 3 4 mkdir aaa cd aaapwd git init
三态转换 查看仓库状态
工作区 Working tree
:即文件目录内容
暂存区 index
:目录 .git
内的 stage/index
(已 add
未 commit
)
版本库 repo
:文件 .git
新修改的文件 (工作区) (untracked)→ 通过 add→ 暂存区 → 通过 commit→ 版本库
工作区->暂存区 1 2 git add <file> git add .
暂存区->版本库 1 2 3 4 5 git commit <file> git commit . git commit -a git commit -amend git commit -m “xxx”
撤销工作区的修改 1 2 git checkout -- <file> git checkout .
checkout
还可以检出提交,查看某个版本的代码:
1 2 git checkout 5aab391 git checkout -
已暂存撤销到工作区(git 不再跟踪) 1 2 3 4 git rm -- cached <file> git reset <file> git reset . git reset --hard
文件改名
删除文件
比较 diff 1 2 3 4 5 6 7 git diff git diff <file> git diff --cached 或 $git diff --staged git diff HEAD git diff <$id1 > <$id2 > git diff <branch1>..<branch2> git diff --name-only HEAD src
^和~的区别
^
代表父提交,当一个提交有多个父提交时,可以通过在^
后面跟上一个数字,表示第几个父提交,^
相当于^1
。
~<n>
表示第 n 个祖先提交,相当于连续的 n 个^
。如HEAD~3
即 HEAD 的父提交的父提交的父提交。如要取 merge 的第二个父提交的父提交:HEAD^2~1
查看历史记录 1 2 3 4 git log git log -p <file> git blame <file> git reflog show master | head
版本回退 这里收集了 四种
方式实现版本回退,通过git reflog
可以查看操作记录。
暴力 reset 回退 1 2 3 4 git checkout master git pull git reset --hard <commit> git push origin master -f
该方式会改变历史进程
,多人开发时会混乱,非常不推荐。
使用 revert 生成一个新 commit 1 2 3 git revert 5aab391 git revert -n 5aab391..1hd2d72 git revert -m 1 5aab391
该方法不会改变历史进程
,适用于单个回滚或者多个无 merge 的回滚。
使用 reset –head –soft 1 2 3 4 git reset --hard 5aab391 git reset --soft 1hd2d72 git commit -m '生成一个新提交,回滚5aab391到1hd2d72的内容' git push xxx
该方法不会改变历史进程
,生成一个新的 commit 来覆盖之前的内容达到回滚,推荐。
使用 -s ours master 1 2 3 git checkout -b v2 4a50c9f git merge -s ours master git push origin master
该方法不会改变历史进程
,生成一个新的 commit 来覆盖之前的内容达到回滚,墙裂推荐。
远程仓库 从远程仓库克隆
创建 SSH Key 1 ssh-keygen -t rsa -c "623212389@qq.com"
用户主目录下 →.ssh→id_rsa(私钥)+id_rsa.pub(公钥)或\$cat ~/.ssh/id-rsa.pub
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 git remote -v git remote show origin git remote add origin git@git…… git remote set-url origin git@git…… git remote rm git pull git fetch git merge git push git push origin master git push -u origin master git push origin <local_branch> git push origin <local_branch>:<remote_branch> git push origin :<remote_branch> git rebase git remote update origin --prune
分支相关 查看分支
查看远程分支
查看所有分支
查看已经被合并到当前分支的分支
查看未被合并到当前分支的分支
创建分支
切换分支或标签
创建加切换
重命名本地分支
删除分支
删除远程分支 1 2 3 git push origin --delete <branchName> git push origin :<branchName>
合并分支 merge 将 feature
分支合到 master
:
1 2 3 4 5 git checkout master git merge feature // 此时如果有冲突,修改冲突后 git a git commit -m 'merge'
此时会将 feature
和 master
分支融合到一起,其中:
如果 feature
的提交全部在 master
提交时间之后,那么直接将指针移到最后即可,master
分支线只有一条,feature
分支信息不保留,如果想保留则执行 git merge feature --no-ff
;
如果 feature
和 master
提交时间交替,那么会多一次冲突提交,master
分支线有 feature
汇入,提交的时序以各自分支的时间为准(即交替);
如果在合并分支时想同时合并 feature
的 commit
,则执行:git merge feature --squash
;
撤销合并: git merge --abort
;
rebase 将 feature
分支合到 master
:
1 2 3 4 5 6 7 8 git checkout feature git rebase master // 将 master 作为 基底,此时会将feature上的所有后于master的提交全部转化为一个个的补丁,往master上应用,如果有冲突,修改冲突后 git a git rebase --continue // 然后进入下一个补丁应用,补丁打完后,执行 git checkout master git rebase/merge feature
rebase
的好处是分支线将只有一个,没有多余的 feature
分支线,也没有多余的提交历史,提交的时序也发生改变,以打补丁的时间为准(即先是 master
的提交,后是补丁的提交)
撤销合并: git rebase --abort
;
merge
和 rebase
区别
rebase
可以尽可能保持 master
分支干净整洁,但会丢失分支信息 (推荐)
merge
不能保持 master
分支干净,但是保持了所有的 commit history
注意 分支 merge 到 master 后,只有一个 commit 即提交解决冲突的 commit。
合并提交(commit) 假如有 6 次提交 commit 从旧到新依次是:master1, master2, master3, master4, master5, master6
,目标合并 master3, master4, master5, master6
,最终效果为 master1, master2, masterN
reset 1 2 3 git reset HEAD~4 //前4次提交 git a git commit -m 'masterN'
reabse 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 git rebase -i HEAD~4 // 修改 后3个 pick 为 s,即以第一个pick为基点合并 // pick 91a5777 master3 // s dcecb67 master4 // s 5ac7381 master5 // s c032d0b master6 ----- // 然后再删除其他无用的commit信息,重写 1st commit message // masterN
合并中间部分提交 1 2 3 4 5 6 git checkout -b 分支T <终点提交> // 基于需要被合并的提交段的终点提交创建新的临时分支T git reset HEAD~4 //前4次提交 git a git commit -m 'masterN' git checkout origin git rebase --onto 分支T <终点提交>
暂存管理 1 2 3 4 5 git stash git stash list git stash apply <暂存编号> git stash pop git stash clear
创建标签 1 2 3 4 5 6 7 git tag v1.0.0 git tag -a v1.0.0 -m "你的附注信息" git tag git show v1.0.0 git tag -d v1.0.0 git push origin :refs/tags/v1.0.0 git push --tags
挑拣提交 1 git cherry-pick 1hs73hds
忽略特殊文件 使用 Windows 的童鞋注意了,如果你在资源管理器里新建一个 .gitignore
文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为 .gitignore
了。
github 在 GitHub
上,可以任意 Fork
开源仓库; 自己拥有 Fork
后的仓库的读写权限; 可以推送 pull request
给官方仓库来贡献代码。
总览图