先来个分区介绍
设置 git config--global
设置贡献者 git config --global user.name 和 git config --global user.email
查看所有配置项 git config --list
设置公钥 ssh-keygen -t rsa -C “您的邮箱地址” 在c相对应的路劲找到用记事本打开,粘贴到github上才能git clone
1、放弃本地的所有修改,强制更新为版本上的代码
git fetch --all
git reset --hard origin/master
git pull
2、各种撤销操作
2-1、撤销本地修改、未add (会恢复到修改之前)
git checkout -- <filename> #撤销单个文件
git checkout . #撤销本地所有修改 √
git reset --hard <filename> #撤销指定文件本地代码到上个提交的版本
git reset --hard #撤销本地代码到上个提交的版本 √
附:reset会回退、checkout是放弃修改
2-2、撤销git add操作
①先执行git reset ②再执行git checkout -- <filename> #撤销单个文件 (会恢复到本地文件修改之前)
①先执行git reset ②再git checkout . #撤销本地所有修改(会恢复到本地文件修改之前)
git reset --hard <file> #撤销本地代码到上个提交的版本(会恢复到本地文件修改之前)
git reset --hard #撤销本地代码到上个提交的版本(会恢复到本地文件修改之前)
2-3、撤销git commit操作
git reset --hard origin/masterName (直接回退到远程最新版本)
git reset --hard HEAD~1 (会恢复上一个版本)
git reset --hard HEAD^ 上个版本回退
git reset --hard HEAD~N 多个版本回退,n是数字 代表要回退的次数
git reset --hard <commit_id> 指定版本回退
git commit --amend <files> 覆盖上一次的提交
2-4、撤销git push操作
git reset --hard HEAD (git reset --hard <tag/branch/commit id>)
- git reset --hard HEAD^ 或
- git reset --hard "HEAD^" 或
- git reset --hard HEAD^^ 或
- git reset --hard HEAD~ 或
- git reset --hard HEAD~1
(^可能git会出现需要填写more信息,因为工具识别^为空格)另外:git reset 后,可能因为权限的问题无法强行git push --force。但是难道如果程序员误操作提交了一次错误的东西到master就没法回滚了(指不需要gitlab管理员来回滚)
git revert <commit_id> 会生成一个新的commit
或者
git reset --hard HEAD^
git push -f
附:
git reset 参数 (<commit_id>从git log中取,取前7位即可,git reflog - 10 查看更简洁)
git reset --soft <commit_id> #程度最轻,仅仅是把版本库的重置,暂存区和工作区没做任何修改。 【返回到某个节点。保留修改】
git reset --mixed <commit-id> (默认情况)程度中,也是默认操作,它把版本区和暂存区都重置了,但是工作区没有重置。
git reset --hard <commit_id> 程度最强,三个区全部重置了 【返回到某个节点,不保留修改】
git revert 与 git reset 的区别
git reset是指HEAD指针,重新指向某个commit-id的位置。并且它后续的commit-id会被删除。git revert会产生一条新的commit,原有的commit-log并不会发生任何变化。
总结:四个阶段都可以使用git reset
更多撤销参考有关文档:
checkout
commit
rebase
reflog
reset
revert
rm
3、设置大小写敏感
git config core.ignorecase false
4、分支操作
创建分支 git branch branchname
查看
查看所有分支 git branch -a
查看远程分支 git branch -r
查看本地分支 git branch
切换分支 git checkout branchname
重命名分支 git branch -m | -M oldbranch newbranch
删除本地分支
删除branchname分支 git branch -d | -D branchname
删除远程分支(其中一条)
git branch -d -r origin/branchname 这个删除以后还要推送
git push origin :branchname 【推荐】 推送空分支到远程(删除远程分支另一种实现)
git push origin --delete branchname 【推荐】
获取远端分支信息,可以查看本地和远端不同 git remote show origin
同步远程分支(远程以上删除,但是本地还可以看到用这个命令)git remote prune origin
推送分支 git push origin branchname
查看当前分支的远程地址 git remote -v
关联分支 git remote add origin url.. 关联后可能还是不能推送和拉取需要手动建立追踪关系 (git branch --set-upstream branchaName origin/branchName),如果还是不能提交提示“error merging: refusing to merge unrelated histories” 尝试(写git pull origin master --allow-unrelated-histories需要知道,我们的源可以是本地的路径)
远程仓库地址变了,本地仓库地址也相应的修改 git remote set-url origin <新的git url>
基于指定分支创建子分支 git checkout <remote>/<branch> -b <branch>
5、git stash
查看
git stash list
新建
git stash save "备注的内容" 保存当前未commit的代码并添加备注
在原分支 git stash save -a "messeag",(-a 会把忽略的文件都添加进去) git stash -u
恢复
git stash apply 应用最近一次的stash
git stash pop 恢复最近一次,随后删除该记录
git stash pop stash@{id} 或者 git stash apply stash@{id}即可
原来git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除,
而 git stash apply stash@{id} 命令则会继续保存stash id。
删除
git stash drop 删除最近的一次stash
git stash drop <stash@{id}>
git stash clear 是清除所有stash
6、换行符的修改
git config --global core.autocrlf false 参考:http://blog.csdn.net/ccfxue/article/details/52625806
7、用a分支的test.js文件或者文件夹 覆盖 b分支的test.js或文件夹
首先切换到b分支上 ,然后git checkout branchB xxx/xxx/test.js 更多参考:https://git-scm.com/docs/git-checkout
运行 git checkout -m [path],可以知道哪边代表 ours ,哪边代表 theirs
然后使用命令 git checkout --theris 1.txt 选择 test 分支
Git合并特定commits 到另一个分支 http://blog.csdn.net/ybdesire/article/details/42145597
提取/合并某分支的部分文件 http://www.cnblogs.com/xulingfeng/p/5864041.html
8、忽略提交文件
已经到版本库的文件
在.gitignore 添加需要忽略的文件或者文件夹
git rm -r --cached ‘文件夹或者文件路劲’ #删除追踪状态
git add .
git commit -m "fixed untracked files"
仅在自己本地忽略
git update-index --assume-unchanged xxx/xx.txt
恢复提交已忽略的文件git update-index --no-assume-unchanged xxx/xx.txt
9、git merge高级合并
①(master)git merge --squash dev ##合并压缩,将dev分支上的commit压缩为一条 (这样不会把dev上所有修改的commit都提交上去)
②(master)git merge --ff dev # ff 就是 fast forward的意思 将不会创造一个新的commit节点。【默认】情况下,git-merge采用fast-forward模式。
③(master)git merge --no-ff dev # 即使可以使用fast-forward模式,【也要创建一个新的合并commit节点】【并强制保留develop分支的开发记录】(而fast-forward的话则是直接合并,看不出之前Branch的任何记录)。这对于以后代码进行分析特别有用
所以 --no-ff 和 --squash 是对立的不能同时执行
参考:
Git - Reference
Git - Book
git-merge完全解析 - 简书
10、Git删除本地分支以及重新拉取远程分支到本地
a、删除本地分支
- git checkout master (首先切换到本地一个其他的分支,这里我切换到本地master)
- git branch -D dev (删除本地分支dev )
b、重新拉取远程分支dev到本地
- git fetch origin dev (还是在master分支下进行操作,拉取远程分支dev到本地)
- git checkout -b dev origin/dev(还是在master分支下进行操作,在本地新建dev分支)
- git pull origin dev(切换到本地dev分支,把dev所有内容拉取到本地)