Markey's home

git总结

2018/01/15 Share

GIT学习笔记

仅为本人在工作过程中学习git的一些经验总结,还是git菜鸟一只,有更好的见解欢迎留言 ~

经验总结

  1. 在解冲突时一定要注意,对自己不熟悉的代码要问问是谁写的在解. 如果出现问题,用 git merge –abort 可以将冲突文件退回到merge之前的状态
  2. 在新建一个开发分支时,一定要基于master分支建,不要让其他分支上的代码掺入你的开发分支
  3. 若想更新本地仓库中的分支或tag,用 git fetch [远程仓库] 则将远程仓库的所有更新取回本地,git fetch [远程仓库] <分支名> 还可以在后面制定分支名,表示只取得该分支的更新,git fetch –t 表示取得所有更新及tag

配置相关

  1. git config –list 查看当前的配置项;
  2. git config –unset [配置键].[配置名] 删除某项配置;
  3. git config –global alias.br branch 设置br为branch命令快捷命令(全局);

分支相关

  1. 要删除远端分支,可以 git push origin :feature-index-1207,在分支前加个冒号表示为空分支,推送一个空分支到远端就删除了这个分支;
  2. git是支持将本地分支push到远程的另一个分支的
    git push origin develop:master -f
    将本地的develop push到远端的master分支,-f为强制标记
  3. git branch –m 旧分支名 新分支名 重命名某个分支
  4. 若push之前没有pull远端代码,并且远端有修改的话,是不能push上去的,会提示你先pull再push.
  5. git branch –set-upstream-to origin/[branch] 设置本地分支跟踪远端分支,当这样设置后,pull以及push都无需指定origin [branch]了

    :push本地新建的分支到远端,可以用git push –u origin [branch],这样就自动跟踪了远端的这个分支

  6. git branch –unset-upstream 清除当前分支的追踪分支

  7. git branch –track [branch] [remote-branch] 新建一个本地分支,并与远端分支建立追踪关系
  8. 新建的开发分支不用时刻保持跟master最新的关系,合并到master的时候只是把你的修改合并,并不会将你的分支的其他代码也合并,就是说master中代码还是最新的,并且添加上了你的分支的修改,若有冲突则会合并失败,需要解冲突。
  9. 使用git rebase [分支名]“干净地”合并。与merge一样,主要都是为了保持开发分支与master同步。只不过merge会保留很多无用的commit,并且commit的顺序是根据时间排序的,而rebase默认则是将开发分支的commit排在最后(尽管可能commit时间比master某些commit早)。
    • 当rebase过程中有冲突时可以用git rebase –abortgit rebase –continue等命令控制rebase流程
    • 使用git rebase -i [分支名]可以做很多commit相关操作,如可以修改commit message、将多个commit合并为一个等
  10. 当本地有修改未添加到暂存区或提交时,会无法checkout到已有分支,而用git checkout -b [新分支名]命令切换到新分支则没问题,并会把修改带到新分支
    • 该问题也可以使用git stash命令解决,该命令将工作区的修改保存,通过git stash list可以查看当前保存的所有操作
    • git stash pop [stash序号]恢复保存的工作区修改到当前分支
    • git stash clear清空所有stash
  11. git merge –squash [分支名]将本地另一个分支所有提交合并为一个,并添加到当前分支的暂存区

对比及回退

  1. git比对本次跟上次提交的区别: git diff HEAD HEAD^ –stat(显示的不详细);

    :git diff 此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。(若没有提交暂存区,则会比对上次提交的快照)

    :若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用 git diff –cached 命令。

  2. git reset –hard [commit_id] 回退到某次的commit状态,并将本地源码也恢复到那次commit的状态

    git reset –soft [commit_id] 回退到某次的commit状态,但本地源码保持不变,并保存到暂存区,如需提交,重新提交即可

    git reset [commit-id](git reset –mixed [commit-id]) 回退到某次的commit状态,但本地源码保持不变,如需提交,重新提交即可

    git reset HEAD 撤销已暂存的文件

    git reset HEAD~[n] 撤销到倒数第n次提交

    git checkout 摒弃对文件的修改(若无暂存状态,则会退到上次commit; 若有,则回退到上次暂存状态)

    git reset [commit-id | 分支名] 也可以将单个文件恢复到指定提交,但无法使用以上模式,当前分支修改保持不变,reset到的目标分支加入到暂存区

    :git reset 到某次commit都会删除git log中那次的commit信息,即回退后就无法再回到之前的commit了

    :git reset 也可以reset到另一个分支的最后一次提交状态,如: git reset –hard develop,同时也可以reset到远端分支的最后一次提交,如git reset –hard origin/[远端分支名]

  3. git revert HEAD 回退到最近一次提交的前一次提交

    git revert HEAD~[n] 回退到倒数第n次提交的前一次提交

    git revert [commit_id] 回退到指定提交的前一次提交

    :revert相比reset更安全,因为它是生成一次新的提交记录,保留原有的提交记录。

    :经测试,这里所说的前一次提交是指代码是前一次提交的状态,但显示revert到的commit_id还是指定的commit_id。这一点要跟reset区分开。

  4. git commit –amend 将暂存区中的更改更新到最近一次提交(不会产生新的提交记录)

    :若提交时忘了提交某些修改可以用该方法补救

  5. git log -p [file] 查看指定文件每次提交的diff
  6. git log -g 按照操作顺序查看所有操作,包括checkout、commit、merge、reset等等。当分支被误删,想要恢复那个分支的代码时,该指令很有效。使用 git branch [分知名] [commit_id] 即可恢复分支。

    :添加到暂存区是不会有记录的

  7. git cherry-pick [commit_id]可以将其他分支上的提交,在当前分支再提交一次,生成的新commit_id不同

SSH

原理

你必须为自己创建一对密匙,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的公钥进行安全验证。服务器收到请求之后,先在你在该服务器的目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的密钥解密再把它发送给服务器。
SSH key(密钥对)

是git对用户进行身份验证的重要根据,若该用户的电脑上没有ssh key,或者有但是没有添加至ssh agent或你的git account,是无法连接到github进行远端操作的(可通过ssh -T git@github.com 命令才验证)

因此,需要创建ssh key并添加至你的git account。
步骤如下:

  1. 本地创建ssh key

    在git bash中输入 ssh-keygen -t rsa -C “your email address”命令,然后回车,再输入两次密码即可(该密码在你设置ssh key 到git account时会用到)
  2. 添加到你的ssh agent上

    先检测ssh-agent是否运行 $ eval $(ssh-agent -s)
    添加SSH key到ssh-agent $ ssh-add 你的密钥文件路径(一般是id_rsa)
  3. 登录到你的git账户,在settings目录下找到SSH key设置,将你的公钥复制到key选项中,title随意,完事 ~

    :可以通过ssh-add -l命令判断当前正在使用的ssh-key,如果有在使用的key,则会输出该key的fingerprint。并且默认的~/.ssh/id_rsa、 ~/.ssh/id_dsa以及 ~/.ssh/identity是自动加入SSH authentication agent的,因此无需再手动ssh-add,如果你使用的是其他名字的key,则要手动加入!

CATALOG
  1. 1. GIT学习笔记
    1. 1.1. 经验总结
    2. 1.2. 配置相关
    3. 1.3. 分支相关
    4. 1.4. 对比及回退
    5. 1.5. SSH