Git:学习笔记(日常操作版)

  • Post author:
  • Post category:其他




说明:本文主要学习资源来自大佬

廖雪峰




Mac 上配置 git 和设置 ssh

  1. 生成SSH KEY , 邮箱填自己的
$ ssh-keygen -t rsa -C 44600937@qq.com
  1. 一路回车,生成文件
  2. 打开创建的 id_rsa.pub 文件,复制内容
//	定位到 id_rsa.pub 文件
cd .ssh
// 打开 id_rsa.pub 文件
open id_rsa.pub
  1. 填到所需的位置,比如 github
  2. Settings ——> SSH and GPG keys ——> New SSH key

    在这里插入图片描述

    最后说下为什么要设置SSH。git基于多种传输协议,其中最常用的就是https和ssh。都是为了数据传输安全,那么设置ssh密钥的目的是为了节省输入用户名密码的过程,同时保证传输安全。 如果不设置SSH,每次提交代码都需要输入密码,就很麻烦~



初始化仓库

  1. cd 到该目录下
  2. git init



文件添加上传

  1. 要添加的文件一定要在仓库目录或子目录
  2. git add readme.txt 把文件添加到仓库
  3. git commit -m “测试案例添加” 把文件提交到仓库 , -m 是添加说明的



文件更改后的操作:

  1. git status 查看哪些文件有变动
  2. git diff readme.txt 查看文件哪里有变动
  3. git add 确认修改后添加到仓库
  4. git commit -m “修改!!” 提交到仓库



版本回退:

  1. git log 查看由近及远的提交日志
  2. git reset – – hard HEAD^ 版本回退一个版本 ,回退一个版本是一个^,回退两个版本是^^,一百个是HEAD~100
  3. git reset – – hard bf22ac 回退到某个版本号
  4. git reflog 查看命令历史



撤销修改:

  1. 只是修改文件没有执行add命令,撤销: git checkout – – one.txt
  2. 修改文件并执行add命令,撤销:git reset HEAD one.txt



删除及恢复:

  1. 本地手动删除git rm one.txt
  2. git commit -m “delete one.txt”
  3. 本地删除,代码库未删除——恢复: git checkout – – one.txt注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!



远程仓库(以GitHub为例):

  1. 创建 ssh ,把生成的 id_rsa.pub 放入GitHub的 SSH keys创建一个新仓库 New Repository
  2. git remote add origin git@github.com:michaelliao/learngit.git添加后,远程库的名字就是 origin
  3. git push -u origin master把本地库的所有内容推送到远程库上
  4. 把代码下到本地 git clonegit@github.com:SkyMissT/learngit.git 即可



创建与合并分支:

  1. git checkout -b test 创建分支 test 并切换到分支(相当于下面2,3)
  2. git branch test 创建分支 test
  3. git checkout test 切换到分支 test
  4. git branch 列出所有分支,前面有*的表示当前分支
  5. git merge test 合并分支(先切到master后再执行),此处推荐用git merge –no-ff test ,详情见后面
  6. 合并后删除分支 git branch -d test
  7. 强行删除分支 git branch -D branch_test



解决冲突

在这里插入图片描述

  1. 先切到主干上,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.
  1. git status 查看冲突的文件,解决冲突
  2. Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存
  3. git log –graph –pretty=oneline –abbrev-commit用这个查看分支的合并情况

在这里插入图片描述

  1. 删除分支 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

  1. 保存现场 git stash
  2. 创建新分支修改bug,提交、合并到主干,删除bug分支
  3. 查看stash,git stash list
  4. 恢复现场 git stash pop 同时删除stash内容
  5. 目前的情况是master分支已经修改了bug,开发分支dev上并没有修改,怎样在dev上修改同样的bug
  6. 切到dev分支 git switch dev
  7. git cherry-pick 4c8052e (这个是bug分支上修改bug时commit的版本号



多人协作

  1. 查看远程库的信息 git remote
  2. 查看远程库的详细信息 git remote -v
  3. 推送分支,把该分支所有本地提交推送到远程库
pacteradeMBP:learngit linmu$ git push origin master
Everything up-to-date
  1. push代码前一定要抓取远程代码 git pull ,解决冲突后再push
  2. 建立本地分支与远程关联git branch –set-upstream branch-name origin/branch-name



标签管理

标签(tag)从本质将就是指向某个commit的指针,好处是有个更容易记住的名字

  1. 切到要打标签的分支 git tag v1.0 ,默认标签打在最新提交的commit上
  2. 标签打在特定版本号上 git tag v1.1 <版本号>
  3. 查看所有标签 git tag
  4. 创建有说明的标签,-a 指定标签名,-m 指定说明文字 git tag -a v1.2 -m “稳定版本1.2” <版本号>
  5. 详细查看某个标签 git show v1.1
  6. 删除标签 git tag -d v1.0
  7. 推送标签到远程 git push origin v1.0
  8. 推送所有标签到远程 git push origin –tags
  9. 删除远程的标签

    1. 删除本地标签: git tag -d v1.0
    2. 从远程删除: git push origin:refs/tags/v1.0



git fetch 与 git pull 区别

git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中

git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。



忽略文件


各类忽略文件



Android 忽略文件请见此处

  1. .gitignore 文件编辑完后放在工作区
  2. git add .gitignore
  3. git commit .gitignore -m ” add ignore file ”
  4. 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分支的最近一次提交,转移到当前分支。



版权声明:本文为xihuailu3244原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。