git用法之常用命令[克隆、提交]

时间:2022-01-30 19:25:39

1、克隆/下载项目

  1)git clone git@git.soydai.cn:liuxuewen/static-file-3.0.git  或者

  2)git clone http://git.soydai.cn/liuxuewen/static-file-3.0.git

区别:

  a: 第1种使用ssh协议下载,第二种使用http协议,而Git支持多种协议包括 ssh、http、https;

  b: 通过http、https协议下载时,需要输入 Username、Password 登录成功才会下载到本地;

  c: 通过ssh支持的原生git协议速度最快。

2、git提交的常见用法

  1)git add . 或者 git add www/js/a.js  ------添加(所有改动文件/具体某个文件)到暂存区

  2)git commit -m '修改xxxbug'     ------描述并提交到本地当前分支

  3)git push origin develop        ------提交到服务器

 

分析 1)第1步 git add xxx 的目的是什么,为什么要先提交到暂存区?

  答:暂存区存在的主要目的是,为了把当前的确定好已完成的改动暂存先存储起来,来以下几种常见情况,比如:

    a. 改某一次的bug涉及到 a.js、b.js、c.js,修改完a.js后通过 git add a.js 暂时存储到暂存区。此后修改b.js,改到中途改乱了,想回退,怎么办?第一种是 ctrl + z,但可能不巧的是,中间改一半的时候关闭过页面,此时ctrl+z到中间就退不回去了。此时,暂存区就可以发挥作用了。git checkout -- b.js,b.js 回退到修改之前的版本。ctrl + z 完全不用管。

    b. 改某一次的bug涉及到 a.js 一个文件,但是修改非常复杂,涉及到其中的多处地方。快修改结束时,发现有点问题,想回退,由于修改的地方太多,此时 使用 ctrl+z 看得眼花缭乱,怎么办?可以在修改到某一个关键节点时,可以 git add a.js 暂存起前面已经确定的修改。然后可以往后修改,确定改好一处,就暂存一次,这样想回退时,就可以 git checkout -- a.js 退到上次已确定的地方。

  顺便说下,git add . 和 git stage ./xxx 的作用是一样的,stage 翻译过来是阶段,Git是非常鼓励上面几种情况的分阶段暂存的。推荐使用 git stage ...

分析 2)第二步 git commit -m 'xxx' 的意义是什么?最好什么时候使用该命令?

  答:该命令是提交到本地当前分支,-m 'xxx' 是描述这次提交所完成的内容描述。什么时候使用?在某次大的功能开发中,在完成每个小功能模块的开发时,可以先commit到本地分支。

  比如,自己某次的功能开发涉及到三个任务,每个任务的开发过程中,可以通过 git add xxx 暂存的形式小步前进,在完成一个个具体的任务时,通过 git commit -m 'xxx' 描述并提交到本地分支。

  注意:有时候,只是一个很小的bug改动,如果先 git add xxx 再 git commit -m 'xxx' 觉得两步有点麻烦,可以简写成一步:git commit -a -m 'xxxx' 即可。但是,要注意的是,如果你有新增的 文件,一步可是不能到位的,必须要 git add xxx 来一下。

分析 3)第三步 git push origin develop 的几种命令方式?可能遇到的问题?

  答:该命令是将在本地分支上的代码,提交到服务器。

    git push 的几种命令方式:

      1: git push origin xxx  提交到服务器的xxx分支

      2: git push   直接提交,你会发现,有时候是可以直接 git push ,但有时候会有提示:  

fatal: The current branch test has no upstream branch.
To push the current branch and set the remote as upstream, use git push --set-upstream origin test

   会让你先通过 --set-upstream 提交,什么意思?简单点说,提交时如果不指定分支,在服务器那边,是没有一个上游分支去对接。所以需要你先--set-upstream 设置上游分支到服务器,告诉他当前 test 分支的服务器上游分支就是 test 分支。此后在test分支的提交,直接:git push 即可。

   只要之前,有人设置过某个上游分支,其他人就可以直接通过 git push 的形式提交。

   可能遇到的问题有?

   a. 提交时,服务器上的文件有改动,git push 时,会提示:

To git@git.soydai.cn:liuxuewen/soeasy-complete-event-static.git
! [rejected] test -> test (fetch first)
error: failed to push some refs to 'git@git.soydai.cn:liuxuewen/soeasy-complete-event-static.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

   因为该项目服务器下已经有过改动,然后本地在提交时,需要先 git pull 下来。目的是:在提交时做好代码合并工作。

   b. git pull origin xxx 后,如果本地修改的文件 正好其他人也修改了并且提交了,此时,git 会在pull下来后 会出现冲突,提示如下:

remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git.soydai.cn:liuxuewen/soeasy-complete-event-static
96916d0..a7224ce test -> origin/test
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

  告诉你:在 merge a.txt 时发生 冲突。在a.txt里的显示如下:

<<<<<<< HEAD
111122233hahha3
=======
111122aa2333
>>>>>>> a7224ce63514c4a5f92f5341fe53f8bf66c86653

  通过 ====== 区分,上面是本地的改动,下面是服务器当前分支的改动。此时需要手动合并,自己确认哪个是需要修改的。修改完后,再重复上面 1、2、3步

关于git pull

  该命令是拉服务器的最新代码,有两种形式:

  1: git pull origin xxx   直接拉取xxx分支代码到本地

  2: git pull  以默认行为拉取当前分支代码到本地,但是有时候会拉不下来,并会提示:

   490d665..69a9c93  test2      -> origin/test2
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> test2

  让你要么用1的形式指定分支,或者是 先设置上游分支的形式,然后再通过 git pull 来拉取最新代码。如下:

liuxuewens-MacBook-Pro:soeasy-complete-event-static liuxuewen$ git branch --set-upstream-to=origin/test2 test2
Branch test2 set up to track remote branch test2 from origin.
liuxuewens-MacBook-Pro:soeasy-complete-event-static liuxuewen$ git pull
Updating 5dc29be..69a9c93
Fast-forward
d.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

  为什么要这么设置一下?原因是:git pull 意味着 git fetch + git merge,先把服务器代码fetch拉到本地,并且要merge合并到某个分支。如果没有设定上游分支,服务器并不知道 pull 的这个分支,需要合并到你本地的 哪一个分支上!所以,

git branch --set-upstream-to=origin/test2 test2

  设置后,意味着,git pull 当前test2分支时,把服务器的 test2 分支代码 合并到 本地的test2分支。