git使用笔记

 

1、删除远程文件

git rm -rf  origin master  filename 

git commit -m     "asdfasdfa"

git push 

  不光会删除 远程的文件, 本地的也同样会删除调。

git rm --cached -rf useless      //删除远程文件夹,保留本地

git commit -m "remove file from remote repository"

git push

2、git 版本回滚:

  

    git reset --hard commitid  //本地代码回到指定的commitid       或者使用:      git reset --hard HEAD~1      1 代表上一个commit号,可以是n   

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

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

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

      远程的版本回滚:

    git revert  HEAD  //回滚最后一次提交 ,并且要对这次撤销进行commit 。 上一次提交的log还在,但是修改的内容已经回滚。

3、打tag 

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

git checkout master 

git merge develop

git tag -a v1.0.1 -m "Drippay SDK "

git push v1.0.1  将打的tag push 到远程

git tag -d v1.0.1    删除本地的tag

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

git tag         查看本地的所有tag

参考:

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

3、分支创建与删除

       在当前分支上创建分支: 

  git checkout -b testBranch   // 本地就会有一个 testBranch 分支,但是远程还是没有 该分支

  git push origin testBranch   // 远程会有一个testBranch分支

  提交分支数据到远程服务器
    git push origin <local_branch_name>:<remote_branch_name>
    例如:
    git push origin 2.0.1.20120806:2.0.1.20120806
    一般当前如果不在该分支时,使用这种方式提交。如果当前在 2.0.1.20120806 分支下,也可以直接提交   git push
 
  删除远程分支      git push origin -d develop    // 删除远程 develop分支
 
       删除本地分支      git branch -d  test1              //删除本地分支 test1,不能再test1分支上删除test1分支
 
    https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6
 
从某个tag上创建分支:
 
git  branch  newbranchname tag_id    (创建好之后再切换分支)
 

4、 HEAD detached at origin/testBranch

问题出现:
       当本地对某些文件进行了修改, git add 了这几个文件
      git checkout origin develop   // 想拉取远程的某个分支时,就会出现 detached 问题
解决办法:
      ·  git branch temp        //  将本地修改  git add 
       git checkout develp
                   git merge temp   // 将 本地修改merge到develop分支中去了
      git branch -d temp  // 将temp分支删除掉
 

5、初始化仓库 

   ssh-keygen -t rsa -C "your_email@youremail.com"
   ssh-add ~/.ssh/rsa_id                  //将私钥增加到缓存中
 
  如果出现错误:  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"
    
mkdir ~/Hello-World 在user目录下创建一个名为Hello-World的项目文件夹(~代表用户目录,即:C:Documents and Settings当前登陆系统的用户名)
cd ~/Hello-World 更改当前目录到Hello-World目录中
git init 初始化该文件夹,将会提示以下信息:
git clone url

  在某台电脑上已经初始化了github中仓库配置后,gitclone 一个 github项目地址就可以,不需要再配置相应的 邮箱用户名等信息。 

(可能原因为: github为开源项目不需要配置 用户信息等)

6、 git log -p 查看 每个git log的具体改动情况

7、git fetch 和 git pull 的区别

  Git中从远程的分支获取最新的版本到本地有这样2个命令:
  a. git fetch:相当于是从远程获取最新版本到本地,不会自动merge  

Git fetch origin master
git log -p master..origin/master
git merge origin/master

  以上命令的含义:
     首先从远程的origin的master主分支下载最新的版本到origin/master分支上
     然后比较本地的master分支和origin/master分支的差别
     最后进行合并
     上述过程其实可以用以下更清晰的方式来进行:

git fetch origin master:tmp
git diff tmp 
git merge tmp

    从远程获取最新的版本到本地的test分支上
     之后再进行比较合并
  2. git pull:相当于是从远程获取最新版本并merge到本地

    git pull origin master

    上述命令其实相当于git fetch 和 git merge
    在实际使用中,git fetch更安全一些
    因为在merge前,我们可以查看更新情况,然后再决定是否合并

注: merge 并不是将远端文件替换到本地,而是当远端和本地出现文件不同时: 会有merge的冲突,并让开发者决定是否合并或者进行处理。

如果想放弃所有本地的修改,将远程文件拉取到本地进行替换:

git fetch --all          
只是下载远程的库的内容,不做任何的合并
git reset --hard origin/master
把HEAD指向刚刚下载的最新的版本

8、git status 查看状态: 出现的三种状态

  1、Untracked files

    这种情况出现在新建几个文件(版本中不存在的),但是没有提交到暂存区的的时候

  2、Changes not staged for commit

    这种情况出现在版本已有文件遭到修改但是还没提交到暂存区的时候

  3、Changes to be committed

    这种情况出现在提交到暂存区之后的时候

4/   Your branch is ahead of 'origin/master' by 1 commit.

  原因: 远程已经的仓库 滞后 远端,  

  git reset --hard HEAD~x   // x表示滞后远程 x个commit

 9、push 到远端时,本地仓库版本  滞后  远程 仓库

远端的代码库和本地的代码库 版本不匹配,可以先git pull 拉取远端到本地进行merge

注意merge之后还需要进行 add、commit操作,然后再push到远程。

注意: push 时报错如下: (可能是远程master分支被保护起来了,develop没有权限提交代码到master分支)

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

10、切换分支时注意事项:

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

解决办法:

  方法1 : 如果在切换分支之前,git commit 则会 把修改提交到本地仓库(非远程,因为没有push),修改的文件不会带到另一个分支。

      方法2  :  如果还没有开发完成,不想commit, 可以用 git stash (将修改压栈,git status 命令看不到待提交的内容了)  ,切换到其他分支不会看到 当前分支的修改。

再切换到当前分支时,用  git stash pop命令进行出栈操作即可(git status 又可以看到待提交的内容了)。

 

11、分支合并

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)

12、通过git stash 暂存本地代码

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

这时候再  git pull 就不会出现失败了,之后想把自己写的代码合到远程最新的代码中可以通过:

         git stash pop  stash@{0}

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

13. 重命名分支,并提交到云端

   a) 删除云端分支,     git push --delete origin yueduGP

   b) 重命名本地分支: git branch -m  <old_branch_name>  <new_branch_name> 

            如果想重命名当前分支: git branch -m   <new_branch_name>  

  c)  将重命名的本地分支提交到云端: git push origin <new_branch_name>

stash的删除  :

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

14. 本地代码合并已经commit, 但是未提交,远端代码更新

a) git pull 提示如下:

You have not concluded your merge (MERGE_HEAD exists)

b) 解决方法1:保留这次本地合并commit的代码 

      git merge --abort

  git reset --merge

       git pull

解决方法2: 放弃所有本地代码

  git fetch --all

       git reset --hard origin/master 

       git fetch

原文地址:https://www.cnblogs.com/NeilZhang/p/6999794.html