说明:本文主要学习资源来自大佬
廖雪峰
Mac 上配置 git 和设置 ssh
- 生成SSH KEY , 邮箱填自己的
$ ssh-keygen -t rsa -C 44600937@qq.com
- 一路回车,生成文件
- 打开创建的 id_rsa.pub 文件,复制内容
// 定位到 id_rsa.pub 文件
cd .ssh
// 打开 id_rsa.pub 文件
open id_rsa.pub
- 填到所需的位置,比如 github
-
Settings ——> SSH and GPG keys ——> New SSH key
最后说下为什么要设置SSH。git基于多种传输协议,其中最常用的就是https和ssh。都是为了数据传输安全,那么设置ssh密钥的目的是为了节省输入用户名密码的过程,同时保证传输安全。 如果不设置SSH,每次提交代码都需要输入密码,就很麻烦~
初始化仓库
- cd 到该目录下
- git init
文件添加上传
- 要添加的文件一定要在仓库目录或子目录
- git add readme.txt 把文件添加到仓库
- git commit -m “测试案例添加” 把文件提交到仓库 , -m 是添加说明的
文件更改后的操作:
- git status 查看哪些文件有变动
- git diff readme.txt 查看文件哪里有变动
- git add 确认修改后添加到仓库
- git commit -m “修改!!” 提交到仓库
版本回退:
- git log 查看由近及远的提交日志
- git reset – – hard HEAD^ 版本回退一个版本 ,回退一个版本是一个^,回退两个版本是^^,一百个是HEAD~100
- git reset – – hard bf22ac 回退到某个版本号
- git reflog 查看命令历史
撤销修改:
- 只是修改文件没有执行add命令,撤销: git checkout – – one.txt
- 修改文件并执行add命令,撤销:git reset HEAD one.txt
删除及恢复:
- 本地手动删除git rm one.txt
- git commit -m “delete one.txt”
- 本地删除,代码库未删除——恢复: git checkout – – one.txt注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
远程仓库(以GitHub为例):
- 创建 ssh ,把生成的 id_rsa.pub 放入GitHub的 SSH keys创建一个新仓库 New Repository
- git remote add origin git@github.com:michaelliao/learngit.git添加后,远程库的名字就是 origin
- git push -u origin master把本地库的所有内容推送到远程库上
- 把代码下到本地 git clonegit@github.com:SkyMissT/learngit.git 即可
创建与合并分支:
- git checkout -b test 创建分支 test 并切换到分支(相当于下面2,3)
- git branch test 创建分支 test
- git checkout test 切换到分支 test
- git branch 列出所有分支,前面有*的表示当前分支
- git merge test 合并分支(先切到master后再执行),此处推荐用git merge –no-ff test ,详情见后面
- 合并后删除分支 git branch -d test
- 强行删除分支 git branch -D branch_test
解决冲突
- 先切到主干上,git merge feature1 (把分支feature1合并过来)
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
- git status 查看冲突的文件,解决冲突
- Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存
- git log –graph –pretty=oneline –abbrev-commit用这个查看分支的合并情况
- 删除分支 git branch -d feature1
git 合并时 –no-ff 的作用
$ git checkout develop
$ git merge --no-ff feature
–no-ff 的作用是禁止快进式合并
Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward),比如下图:
A---B---C feature
/
D---E---F master
合并分支
$ git checkout master
$ git merge feature
结果如下:
A---B---C feature
/ master
D---E---F
因为 feature 就在 master 的下游,所以直接移动了 master 的指针,master 和 feature 都指向了 C。而如果执行了 git merge –no-ff feature 的话,是下面的结果:
A---B---C feature
/ \
D---E---F-----------G master
由于 –no-ff 禁止了快进,所以会生成一个新的提交,master 指向 G
从合并后的代码来看,结果其实是一样的,区别就在于 –no-ff 会让 Git 生成一个新的提交对象。为什么要这样?通常我们把 master 作为主分支,上面存放的都是比较稳定的代码,提交频率也很低,而 feature 是用来开发特性的,上面会存在许多零碎的提交,
快进式合并会把 feature 的提交历史混入到 master 中,搅乱 master 的提交历史
。所以如果你根本不在意提交历史,也不爱管 master 干不干净,那么 –no-ff 其实没什么用。不过,如果某一次 master 出现了问题,你需要回退到上个版本的时候,比如上例,你就会发现退一个版本到了 B,而不是想要的 F,因为 feature 的历史合并进了 master 里
切分支改bug
假设主干分支是master,开发分支是dev,两个分支上都有此bug
- 保存现场 git stash
- 创建新分支修改bug,提交、合并到主干,删除bug分支
- 查看stash,git stash list
- 恢复现场 git stash pop 同时删除stash内容
- 目前的情况是master分支已经修改了bug,开发分支dev上并没有修改,怎样在dev上修改同样的bug
- 切到dev分支 git switch dev
- git cherry-pick 4c8052e (这个是bug分支上修改bug时commit的版本号
多人协作
- 查看远程库的信息 git remote
- 查看远程库的详细信息 git remote -v
- 推送分支,把该分支所有本地提交推送到远程库
pacteradeMBP:learngit linmu$ git push origin master
Everything up-to-date
- push代码前一定要抓取远程代码 git pull ,解决冲突后再push
- 建立本地分支与远程关联git branch –set-upstream branch-name origin/branch-name
标签管理
标签(tag)从本质将就是指向某个commit的指针,好处是有个更容易记住的名字
- 切到要打标签的分支 git tag v1.0 ,默认标签打在最新提交的commit上
- 标签打在特定版本号上 git tag v1.1 <版本号>
- 查看所有标签 git tag
- 创建有说明的标签,-a 指定标签名,-m 指定说明文字 git tag -a v1.2 -m “稳定版本1.2” <版本号>
- 详细查看某个标签 git show v1.1
- 删除标签 git tag -d v1.0
- 推送标签到远程 git push origin v1.0
- 推送所有标签到远程 git push origin –tags
-
删除远程的标签
- 删除本地标签: git tag -d v1.0
- 从远程删除: git push origin:refs/tags/v1.0
git fetch 与 git pull 区别
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中
git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
忽略文件
- .gitignore 文件编辑完后放在工作区
- git add .gitignore
- git commit .gitignore -m ” add ignore file ”
- git push
删除没有add的文件
git clean -n
是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒
git clean -f
删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过
git clean -f
删除指定路径下的没有被track过的文件
git clean -df
删除当前目录下没有被track过的文件和文件夹
git clean -xf
删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件
相关说明:
Untracked files 没有记录的文件
Changes to be committed: 缓存区的文件,等待 commit
Changes not staged for commit: 修改的文件,等待add,commit
Untracked files: 没有进入git体系的文件
流程图
拉取某个分支的代码
test_branch 是分支的名字
git clone -b test_branch git@github.com:SkyMissT/learngit.git
删除项目中的git信息
rm -rf .git
Git切分支时 smart checkout 与 force checkout 的区别
这是因为切分支时本地的代码没有提交,Git会提示二选其一
smart checkout:把冲突的代码带到目的分支
force checkout:不会把冲突的这部分内容带到目的分支,但是你在当前分支修改的所有内容就会被删除,就算你再切回来也找不到了
代码合并、冲突处理
参考好未来那边的处理方式,开发时都都从主干切出自己的分支,完成功能模块开发后把自己开发的内容提交到主干,一般是在远程通过提 merge request 方式来申请代码合并(后面用mr代替)。如果没有冲突负责人review代码后可以直接合并到主干,如果有冲突则要自己解决冲突。解决冲突方法:先从主干checkout一个分支,把自己开发的内容合并到此分支上,在这里解决冲突。解决完冲突后再用此分支提交mr。这种方式是肯定没问题的!
PS:merge into current 意思是把选的分支合并到当前代码里~
Git报错解决:OpenSSL SSL_read: Connection was reset, errno 10054 错误解决
git config --global http.sslVerify "false"
git config --global https.sslVerify "false"
将代码从一个分支转移到另一个分支:cherry-pick
举例来说,代码仓库有master和feature两个分支
现在将提交
f
应用到master分支。
# 切换到 master 分支
$ git checkout master
# Cherry pick 操作
$ git cherry-pick f
上面的操作完成以后,代码库就变成了下面的样子
从上面可以看到,master分支的末尾增加了一个提交f。
git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。
$ git cherry-pick feature
上面代码表示将feature分支的最近一次提交,转移到当前分支。