git学习(一)

提:

      远程的主机名(远程仓库服务器名):  origin

   本地的主分支: master(本地master分支)

     远程的主分支: maste(远程仓库的master分支)

 

  git clone git@gitlab.com:xxx/yyy.git

  使用git clone命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写,同时会自动设置本地master分支跟踪克隆的远程仓库的master分支。

  使用git remote, 至少应该能看到origin--这是 Git 给你克隆的仓库服务器的默认名字.

  git remote -v, 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL.

  origin git@gitlab.com:xxx/yyy.git (fetch)
  origin git@gitlab.com:xxx/yyy.git (push)

       也可以在运行 git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个可以轻松引用的简写,如添加gs:

  这个名字是作为远程仓库服务器的别名使用, 现在你可以在命令行中使用字符串 gs 来代替整个 URL

   这个名字只能在添加远程仓库时候定义好的,后续建议不要再更改, 在后面的代码中我们就使用origin为远程仓库名. (当然可以使用更换名字git remote rename origin newName) 
假设当前所在的本地分支是master 
$ git remote add gs git@gitlab.com:xxx/yyy.git (fetch)   $ git remote -v   gs git@gitlab.com:xxx/yyy.git (fetch) (fetch)   gs git@gitlab.com:xxx/yyy.git (fetch) (push)   可以运行git fetch gs:   $ git fetch gs   From git@gitlab.com:xxx/yyy.git * [new branch] master -> gs/master
$ git remote remane gs origin
$ git remote -v

origin git@gitlab.com:xxx/yyy.git (fetch) (fetch)
  origin  git@gitlab.com:xxx/yyy.git (fetch) (push)

  当获取数据时候,是使用git fetch [remote-name],例如 

假设当前所在的本地分支是master 

git fetch origin master
git merge master

  必须注意 git fetch 命令会将数据拉取到本地仓库 - 它并不会自动合并或修改当前的工作,  当准备好时必须手动将其合并入你的工作区。

  如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支

git pull = git fetch + git merge
当前本地的分支是master, 远程仓库建立了一个分支masterBranch, 现在要关联到本地
git checkout -b masterBranchLocal origin/masterBranch
(基于本地master创建一个分支masterBranchLocal,并关联远程仓库的masterBranch,同时本地切换到masterBranchLocal)
git branch (可以查看当前的分支是在masterBranchLocal上面)
  * masterBranchLocal
master
git pull origin masterBranch (从远程仓库的masterBranch下载数据到masterBranchLocal分支上)
或则直接git pull (这行语句和上面一样, 因为当前分支和远程仓库的分支已经关联起来了)

下面的三行语句和上面的是等效的,只不过拆开写了.
git branch masterBranchLocal
git checkout masterBranchLocal
git pull origin masterBranch (这里不能直接用git pull, 因为masterBranchLocal没有和任何仓库的分支关联)

  git push [remote-name] [branch-name]。 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将所做的备份到服务器:

 $ git push origin master (推送本地master分支到远程仓库master上)这里省略了 refs/for/master
 $ git push origin master:refs/for/master (和上面的命令效果一样)
$ git push origin masterBranch (推送本地master分支到远程仓库masterBranch分支上, 当前处在masterBranch分支上)

  git push的一般形式为 git push <远程主机名> <本地分支名>  <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名, 第一个master是本地分支名,第二个master是远程分支名。

  如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建

   =============================================================================================================

   1. 如何撤销git reset HEAD~1的操作(其实撤销git reset HEAD~n, n为1,2,3,...):
   假如现在我们要撤销git reset HEAD~4的操作:
   首先: git reflog 出现如下

          

              我们要获取git reset HEAD~4的id, 从图中可以看出, 我们要复制蓝色框里的id值, 不要复制红色框里的id, 因为我们要撤销这个命令,那么就要获得这个命令之前的id值

      复制到的id是:  c3823b7

      $ git reset --hard c3823b7

      这样就可以撤销该命令了

   =============================================================================================================================
  2. 要删除远程的分支, 直接使用命令git push origin :testBranch1

              

    如上图,  使用git branch -r,  查看远程的分支, 现在我们要删除远程分支testBranch1

    使用命令 git push origin :testBranch1

   =============================================================================================================================

  3. 使用git管理代码,最不可避免的出现一种情况:
   假设你基于master分支新建一个分支testBranch1, 去处理一些问题。同时你的另一个同事也在master基础上新建一个分支testBranch2,
    你这个同事更改完了代码,git push到testBranch2上去了, 而且已经merge到master主分支了. 此时你想更新他的代码, 但是自己的testBranch1上代码还没有完成, 怎么办?
   
下面是本人总结的流程, 亲测可以用.
(查看当前所在的分支, 这里我们是testBranch2, 个人开发用的)
git branch 
$ git branch
  master
  testBranch1
* testBranch2

(查看当前分支修改的内容, 还没有提交到testBranch2分支上, 所以这里会显示出修改的文件)
$ git status  
On branch testBranch2
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        testBranch2.txt

nothing added to commit but untracked files present (use "git add" to track)

(这两步是做add和commit, 但是不做git push origin testBranch2操作, 因为我还有继续更改, 你也可以push上去, 看个人习惯了)
(其实这里的操作是为了checkout分支用的, 不用提交也能切换分支, 但是当文件太多时候, 切换到其他分支, 用git status查看修改文件, 也包含这里修改的文件)
(所以建议这里是commit到本地, 即不做push操作, 个人这里是只commit到本地的操作)
$ git add testBranch2.txt  
$ git commit -m "add testBranch2.txt, when checkout back, use git reset HEA~1"
[testBranch2 61acac7] add testBranch2.txt, when checkout back, use git reset HEAD~1
 1 file changed, 1 insertion(+)
 create mode 100644 testBranch2.txt

(切换到master分支, 然后更新master代码) 
$ git checkout master
$ git pull origin master

(切换到testBranch2分支)
$ git checkout testBranch2 

(如果你之前把testBranch2内容push上去了, 这里就不用执行)
(因为我没有push上去, 只commit到本地, 所以这里执行git reset HEAD~1)
(注意这里是先reset, 然后merge)
$ git reset HEAD~1
Unstaged changes after reset:
M       testBranch2.txt

(这里要merge代码, 可以选择使用 --no-ff 这个参数, 看项目需求, 个人建议使用这个参数)
(git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史, 以及branch 状态)
(git merge 则不会显示 feature,只保留单条分支记录)
$ git merge --no-ff master

(在上面执行git reset HEAD~1后, 查看之前修改的文件)
$ git status
On branch testBranch2
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        testBranch2.txt

nothing added to commit but untracked files present (use "git add" to track)

        =============================================================================================================================

未完待续...

 

posted on 2018-04-04 09:37  努力做一个伪程序员  阅读(502)  评论(0编辑  收藏  举报

导航