配置
gitlib秘钥配置
需要自己生成一个秘钥
然后将公钥(默认在~/.ssh/id_rsa.pub)放到网站的个人配置页面,里面有SSH keys添加子页:
基本配置
|
|
别名效果示例:
回车换行的修改
git add 提示会对回车换行做修改
回车换行有两个配置,一个是AutoCRLF:
提交时转换为LF,检出时转换为CRLF
1git config --global core.autocrlf true提交时转换为LF,检出时不转换
1git config --global core.autocrlf input提交检出均不转换
1git config --global core.autocrlf false
二是SafeCRLF:
- 拒绝提交包含混合换行符的文件 1git config --global core.safecrlf true
允许提交包含混合换行符的文件
1git config --global core.safecrlf false提交包含混合换行符的文件时给出警告
1git config --global core.safecrlf warn
入门命令
创建仓库
|
|
提交一个文件
|
|
修改文件后提交
|
|
查看有什么不一样:
再次提交改动:
查看修改记录
常规查看:
单行模式查看:
分支
提交到一个新分支
当前分支情况,只有master:
想要提交commit到newBranch1分支(如果这个分支之前不存在,会自动创建),可以:
删除分支
|
|
从分支克隆
加入-b参数,可以克隆某个分支的数据:
在这样一个只有分支newBranch1的本地仓库中,你的所有操作都默认在此分支:
|
|
|
|
切换到分支再提交
切换分支到newBranch1(如果这个分支之前不存在,会自动创建):
默认是在master上创建分支,可以这里指定从其他地方创建,例如 orign/newBranch1 。
这个checkout -b操作,也可以展开为创建/切换两个步骤:
当然,切换分支前,拉取master的最新改动是一个好习惯,上面的步骤可以改进为:
对于已存在分区,多人更改的时候,你可以拉取分支newBranch1下最新改动:
现在你可以正常add, commit了。
最后将commit推送到分支newBranch1
可以随时切换会到其他分支,例如,切换回master分支:
回滚
放弃本地更改,强制更新
先获取远程内容,这时候没有合并:
再把HEAD指向刚刚获取的最新内容:
回到历史某版本
|
|
撤销回滚到历史版本,回到最新版本
需要记得之前最新版本的commit ID:
撤销工作区的修改
|
|
撤销暂存区修改
|
|
上面已经放入暂存区了,下面撤销:
撤销Commit
比如我现在commit了,但是并没有push:
找要撤销步骤的commit ID,上述为 b88b45e4cd4fa3750199d43b1f156f1175384e7f
一种撤销是,只撤销commit命令,不对修改的代码进行撤销:
另一种撤销是,既撤销commit,还要将代码撤销(代码恢复到commit前的对应版本):
对于已经commit的,需要git reset,如果只是放入了暂存区,就不需要git reset,后面还可以加入:
这样确保“改动文件”在工作区的内容为最新。
删除文件
工作区、暂存区、分支上同时删除
暂存区、分支上删除,但工作区保留(其实就是不希望某文件被版本控制,和.gitignore一个作用,对于已经在分支上的.gitignore无效)
如果递归删除结合reset,可以清除本地的所有改动:
合并
合并newBranch1到当前分支
|
|
使用mergetool处理冲突
|
|
用mergetool来人工处理冲突:
或者
手动处理二进制冲突
两种选择,要么保留欲合并分支的修改:
要么保留自己的修改:
然后提交更改:
放弃本地修改
单文件放弃:
整体放弃
完全以自己的内容为准(危险)
比如,你pull的时候,发现有冲突:
你如果只想保留本地修改,忽略远端修改,可以
注意
这动作非常危险,如果你push了你的提交,会导致别人的修改被丢弃。
##保留本地修改
$ git fetch origin
危险,会导致你没有PULL的别人提交的部分在库上也被丢弃。
$ git merge -s ours origin/master
Merge made by the ‘ours’ strategy.
如果你不小心提交了,导致别人的提交丢失,可以参考rebase示例
放弃合并
|
|
跨版本合并
例如合并3.0.9代码到3.0.10。
- 工作目录目前在3.0.10,把3.0.10下的所有文件都commit,并push。
添加3.0.9为远程分支并取回内容
12git remote add 3.0.9 git@你的服务器:路径/3.0.9.gitgit fetch 3.0.9checkout 3.0.9的master分支到本地,给分支取名 3.0.9-master
1git checkout -b 3.0.9-master 3.0.9/master切换到3.0.10的master分支
1git checkout master将 3.0.9-master 合入到3.0.10的当前工作目录
1git merge 3.0.9-master --allow-unrelated-histories期间会有合并失败的,需要先解决冲突。
提交代码
12git commit -m "merge sip3.0.9"[master cfe833e6f] merge sip3.0.91git push -u origin master
从其他版本的某个分支挑选代码合入当前版本
在预合入的分支下,添加远程分支,将其他版本的某个分支加入进来。
1git remote add -m 其他版本的分支名字 本地名字 git@你的服务器:路径/其他版本.git更新代码。
1git fetch 本地名字把远程分支中要合并的commit Id挑选过来
1git cherry-pick e93ca048978f480c0258df2f2d7f0af67cb4f23e或者用名称也可以:
123git cherry-pick 本地名字/其他版本的分支名字...9 files changed(改动了9个文件), 125 insertions(+)(有125行新增代码), 7 deletions(-)(有7行删除代码)提交代码,这里我提交到一个新分支
1234git checkout -b newBranch1Switched to a new branch 'newBranch1'git push origin newBranch1
rebase示例
merge和rebase都是用于合并代码,差异在于历史记录看起来不一样。
我之前使用 git merge -s ours origin/master 把自己的内容强制merge并push到了master分支,导致我修改期间别人的提交丢失,现在,我准备将别人丢失的部分,重新加入到master分支里面。我这里使用rebase操作,把历史也处理一下。
先把我最新在master上的提叫checkout下来,名称叫mylast,这个版本丢失了其他人的提交的。
12git checkout 6ac5d94fdae15a17108cbdc1700656f1d8b3ad70 -b mylastSwitched to a new branch 'mylast'把别人的最后一次正确提交checkout下来,取名叫skipPoint
12345git checkout 9ac05b78ec9555ef16ab50efe1f31e69617d2be8 -b skipPointSwitched to a new branch 'skipPoint'git checkout mylastSwitched to branch 'mylast'rebase操作,把mylast上的提交取消掉,并将其保存为patch,然后mylast会更新为skipPoint,然后再把mylast原本的path应用到更新后的mylast上。
1234567git rebase skipPointFirst, rewinding head to replay your work on top of it...Resolve all conflicts manually, mark them as resolved with"git add/rm <conflicted_files>", then run "git rebase --continue".You can instead skip this commit: run "git rebase --skip".To abort and get back to the state before "git rebase", run "git rebase --abort".rebase过程中会有冲突,我们需要处理冲突。
例如:12345(mylast|REBASE 1/1)$ git rm /lib64/libutils.sorm '/lib64/libutils.so'(mylast|REBASE 1/1)$ git add /lib64/libutils.soadd '/lib64/libutils.so'所有冲突处理完,可以继续rebase。
1(mylast|REBASE 1/1)$ git rebase --continue对于一些遗漏的commit,佟麟阁cherry-pick合入。
1(mylast|REBASE 1/1)$ git cherry-pick 92578fc27d978ca092f8773e2a866f79c2e554c3提交
1(mylast|CHERRY-PICKING)$ git commit -m "confit"替换master为mylast分支
删除原本的master分支12git branch -D masterDeleted branch master (was 1dea1c102).或者,把原本的master重命名:
1git branch -m master推送覆盖到master
gitlib禁止了覆盖master,需要在 “设置”/“版本库”/“保护分支”下临时去掉保护。12345(master|CHERRY-PICKING)$ git push -f --set-upstream origin masterCounting objects: 202, done.To git@你的服务器:路径/版本.git+ 1dea1c102...2c7ecba76 master -> master (forced update)Branch 'master' set up to track remote branch 'master' from 'origin'.