git用法之常用命令[克隆、提交]
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分支。