git使用总结

git使用笔记

1. git 仓库初始化

github/gitlab 采用https协议,加密方式使用rsa非对称加密,需要在本地生成公钥和私钥。

在git bash中运行产生公钥和私钥的命令,在~/.ssh 目录下会生成一个公钥和一个私钥的文件(id_rsa + id_rsa.pub)

ssh-keygen -t rsa -C "your_email@youremail.com"
ssh-add ~/.ssh/rsa_id                   //将私钥增加到缓存中

然后需要将公钥添加到github/gitlab上,如果出现错误: Could not open a connection to your authentication agent. 需要执行:

ssh-agent bash  // 将公钥上传到某个git网站中

测试是否能连接到远程

ssh  -T  git@192.168.xxx.xxx       

配置个人信息 

git config --global user.name "abc"
git config --global user.email "def"

clone项目

mkdir test_git_project //创建项目目录
git init               //初始化该文件夹,将会提示以下信息:
git clone url

至此,就可以成功的git clone项目了。

1.1 本地需要配置不同的git(github/gitlab)

在~/.ssh目录下新建名称为config的文件(无后缀名)。用于配置多个不同的host使用不同的ssh key,内容如下:

# gitlab
Host gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitlab_id-rsa
# github
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id-rsa
  
# 配置文件参数
# Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
# HostName : 要登录主机的主机名
# User : 登录名
# IdentityFile : 指明上面User对应的identityFile路径

备注:千万不要将公司的域账号配置到github上会被检测到处罚的。

2. 分支管理:创建/删除/重命名

在当前分支上创建分支:

git checkout -b testBranch   // 本地就会有一个 testBranch 分支,但是远程还是没有 该分支
// push到云端testBranch分支(确保当前在testBranch上)
git push origin testBranch 或者直接 git push  
// 不在需要push的分支上:git push origin <local_branch_name>:<remote_branch_name> 

拉取远程分支到本地:

(1)git checkout -b 本地分支名 origin/远程分支名

(2)git checkout --track origin/远程分支名 (这种写法是上面的简化版,效果完全一样)

(3)git checkout -t origin/远程分支名(这种写法是2的简化版)

(4)fetch指定的一个分支:git fetch [repo] [remote_branch_name]:[local_branch_name]

          git checkout [local_branch_name]

删除远程分支

git push origin -d develop    //删除远程develop分支

删除本地分支

git branch -d  test1  //删除本地分支 test1,不能在test1分支上删除test1分支

可参考:https://git-scm.com/book/zh/v2/Git-分支-分支的新建与合并

从某个tag上创建分支:

git  branch  newbranchname tag_id   // (创建好之后再切换分支)

重命名分支

重命名本地分支: git branch -m  <old_branch_name>  <new_branch_name> 
如果想重命名当前分支: git branch -m   <new_branch_name>  
将重命名的本地分支提交到云端: git push origin <new_branch_name>

设置当前分支关联的远端分支:
git branch --set-upstream-to=origin/remote_branch your_branch

3. tag 查看/创建/删除

查看本地的所有tag

git tag

假设我们在 develop分支上开发,当有一个比较固定的版本时,merge到master上,然后打一个 tag

git checkout master
git merge develop
git tag -a v1.0.1 -m "test tag"
git push v1.0.1      // 将打的tag push 到远程

备注: CI版本构建时会自动的打上一个tag,方便代码跟踪

tag删除

git tag -d v1.0.1
git push origin :refs/tags/v1.0.1    同时删除远程的tag

参考:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001376951885068a0ac7d81c3a64912b35a59b58a1d926b000

4. 代码更新

4.1 git status

1、Untracked files
    这种情况出现在新建几个文件(版本中不存在的),但是没有提交到暂存区的的时候
2、Changes not staged for commit
    这种情况出现在版本已有文件遭到修改但是还没提交到暂存区的时候
3、Changes to be committed
    这种情况出现在提交到暂存区之后的时候

4.2 git stash(暂存本地代码)

当远程分支别人更新了代码,本地代码又做了修改(不想放弃辛勤劳作,不能 git revert),这时候git pull 会失败。(git pull 不会把远程代码合并到本地)。这时候可以通过 git stash 将本地修改暂存(git stash list 查看暂存的列表)。这时候再 git pull 就不会出现失败了,之后想把自己写的代码合到远程最新的代码中可以通过:

git stash pop  stash@{0}
//其中: stash@{0} 是将最新的 stash 合并到本地。 合并之后自己的修改就不会丢了,修改好之后可以选择 push到远程。

stash的删除

git stash drop stash@{0}          // 删除栈顶的stash
git stash clear                   // 删除所有 stash 

4.3 git pull与git fetch

a) git fetch:相当于是从远程获取最新版本到本地,不会自动merge  

//从远程的origin的master主分支下载最新的版本到origin/master分支上
git fetch origin master 
// 然后比较本地的master分支和origin/master分支的差别
git log -p master..origin/master
// 远程master合并到本地master
git merge origin/master

b) git pull:相当于是从远程获取最新版本并merge到本地

git pull origin master

上述命令其实相当于git fetch 和 git merge在实际使用中,git fetch更安全一些。因为在merge前,我们可以查看更新情况,然后再决定是否合并
注: merge 并不是将远端文件替换到本地,而是当远端和本地出现文件不同时: 会有merge的冲突,并让开发者决定是否合并或者进行处理。

放弃本地所有修改

//获取最新代码,不做任何的合并
git fetch --all          
// 把HEAD指向刚刚下载的最新的版本
git reset --hard origin/master

当通过git pull 合并远程到本地时,想撤销本地提交:git reset --soft head~1 会出现如下报错:
All conflicts fixed but you are still merging
这时可以先放弃合并: git merge --abort

4.3 删除文件

删除云端 + 本地文件

git rm -rf  origin master  filename 
git commit -m     "test delete file."
git push 

删除远程文件夹,保留本地

git rm --cached -rf filename      //删除远程文件夹,保留本地
git commit -m "remove file from remote repository"
git push

分支合并与冲突解决

https://www.jianshu.com/p/58a166f24c81
总结: 切换分支时,需要了解各个分支之间的关系,当前的修改需不需要带到下一个分支,不需要则需要保存当前的工作空间

git merge --no-ff : (ff代表 fast forward)
  用于禁止快进式合并,快进式合并如下:

合并前: 

          A---B---C feature
         /
D---E---F master

快进式合并: (featrue合并到master后)

          A---B---C feature
         /         master
D---E---F

--no-ff 合并效果:

          A---B---C feature
         /         \
D---E---F-----------G master

使用--no-ff好处:

  由上面的合并记录就可以看出区别: --no-ff 不会将feature分支的commitId合并到master上,后续如果需要版本回退时直接可以回退到F的commitId。 但是如果使用快进式合并,在纷杂的提交记录(D-E-F-A-B-C)找到合并之前的commit号还是比较费劲的。

git merge --no-commit: (合并后是否自动产生一个commitId)

配置ff和commit默认值:

  1. 直接配置gitconfig文件($HOME/.gitconfig:)
[merge]
    ff = no
    commit = no
git config --global merge.commit no
git config --global merge.ff no

版本回滚

git reset

 git reset --hard commitid  // 本地代码回到指定的commitid       
 git reset --hard HEAD~1    // 1代表上一个commit号,可以是n   
 git reset --soft HEAD~1    // 与--hard区别是:soft会撤销commit但是,会保留代码的更改到本地

git reset 只是将本地的仓库进行了回滚,远端并没有变化,需要push才能推到远程,此时push会提示:

[remote rejected] master -> master (pre-receive hook declined)
    error: failed to push some refs to 'git@192.168.xx.xx:xxx/xxx.git'

可以通过备份远程分支,然后删除远程分支,将本地推送到远程的一个新的分支上。 或者强制推送到远端:

git push -f origin branchname  //git服务器代码回到指定的commitid

备注:正常项目开发中分支会受到保护,非master权限无法强制推送到远端。 由于revert后提交记录无法找回,所以不建议在项目中使用git reset --hard 来回滚代码。

git revert

git revert 撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。
git revert HEAD #撤销倒数第一次提交
git revert HEAD^ #撤销倒数第二次提交
git-revert HEAD~2 #撤销倒数第三次提交
git revert commit(比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。

git commit -m "do an revert"

git push

分支管理规范

分支保护

问题解决

注意事项

切换分支:
切换分支时需要保证当前分支时纯净的,当本地对某个文件做了修改,但是没有git commit时,这时候切换到另一个分支,本地的文件还是修改的状态,会影响到另一个分支。

解决办法:

方法1 : 如果在切换分支之前,git commit 则会 把修改提交到本地仓库(非远程,因为没有push),修改的文件不会带到另一个分支。
方法2  :  如果还没有开发完成,不想commit, 可以用 git stash (将修改压栈,git status 命令看不到待提交的内容了)  ,切换到其他分支不会看到 当前分支的修改。
再切换到当前分支时,用  git stash pop命令进行出栈操作即可(git status 又可以看到待提交的内容了)。
posted @ 2019-08-07 08:38  NeilZhang  阅读(303)  评论(0编辑  收藏  举报