git clone:
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,通常来说,Git协议下载速度最快,SSH协议用于需要用户认证的场合。在clone完成之后,Git 会自动为你将此远程仓库命名为origin(origin只相当于一个别名,运行git remote –v或者查看.git/config可以看到origin的含义),并下载其中所有的数据,建立一个指向它的master 分支的指针,我们用(远程仓库名)/(分支名) 这样的形式表示远程分支,所以origin/master指向的是一个remote branch(从那个branch我们clone数据到本地),但你无法在本地更改其数据。同时,Git 会建立一个属于你自己的本地master 分支,它指向的是你刚刚从remote server传到你本地的副本。随着你不断的改动文件,git add, git commit,master的指向会自动移动,你也可以通过merge(fast forward)来移动master的指向。
git clone + 远程仓库项目网址:
克隆远程仓库项目到本地仓库,也就是俗称的拉代码,本地仓库生成的项目与远程仓库的项目结构一致。git clone + 远程仓库项目网址 + 本地仓库项目目录:克隆远程仓库项目到本地仓库,本地仓库生成的项目放在第二个参数【本地仓库项目目录】中
git fetch:
理解 fetch 的关键, 是理解 FETCH_HEAD.FETCH_HEAD指的是: 某个branch在服务器上的最新状态.每一个执行过fetch操作的项目都会存在一个FETCH_HEAD列表, 这个列表保存在 .git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支.git fetch这一步其实是执行了两个关键操作:- 创建并更新所有远程分支的本地远程分支.- 设定当前分支的FETCH_HEAD为远程服务器的master分支 (默认的)相当于在本地新建了一个分支,不过这个分支是隐藏的,也可以理解为,将远程的更新克隆的到了本地,但是还没有与本地的文件合并.拉下来的更新用 origin/master 来访问,后期可用git branch origin/master 来合并刚刚拉下来的更新需要注意的是: 和push不同, fetch会自动获取远程'新加入'的分支.git fetch origin同上, 只不过手动指定了远程仓库.git fetch origin branch1取回指定分支远程仓库的branch1分支的更新到本地注意: 在这种情况下, 不会在本地创建本地远程分支, 这是因为:这个操作是git pull origin branch1的第一步, 而对应的pull操作,并不会在本地创建新的branch.
git fetch origin branch1:branch2
首先执行上面的fetch操作,使用远程branch1分支在本地创建branch2(但不会切换到该分支), 如果本地不存在branch2分支, 则会自动创建一个新的branch2分支, 如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.
git fetch origin :branch2
等价于: git fetch origin master:branch2
git rebase + 分支名称:
合并分支,与fetch连用,合并修改,fetch了哪个分支就合并哪个分支
git branch -r:
显示远程分支
Git push:
git push origin 本地分支A : 远程分支B
push 本地分支A到远程库origin的分支B HEAD指向当前工作的branch,master不一定指向当前工作的branch可以发现,master就是local branch,origin/master是remote branch$git diff origin/master master (show me the changes between the remote master branch and my master branch).需要注意的是,remotes/origin/master和origin/master的指向是相同的$git diff origin/master remotes/origin/master git push origin masterorigin指定了你要push到哪个remotemaster其实是一个“refspec”,正常的“refspec”的形式为”+:”,冒号前表示local branch的名字,冒号后表示remote repository下 branch的名字。注意,如果你省略了,git就认为你想push到remote repository下和local branch相同名字的branch。听起来有点拗口,再解释下,push是怎么个push法,就是把本地branch指向的commit push到remote repository下的branchgit push origin master:master (在local repository中找到名字为master的branch,使用它去更新remote repository下名字为master的branch,如果remote repository下不存在名字是master的branch,那么新建一个,如果存在则报错)git push origin master:(省略了,等价于“git push origin master:master”)
git push origin master:refs/for/mybranch :
(在local repository中找到名字为master的branch,用他去更新remote repository下面名字为mybranch的branch)
git push origin HEAD:refs/for/mybranch :
(HEAD指向当前工作的branch,master不一定指向当前工作的branch,所以我觉得用HEAD还比master好些)
git push origin :mybranch :
(再origin repository里面查找mybranch,删除它。用一个空的去更新它,就相当于删除了)
git stash:
git栈,在切换分支的时候,当前分支有未完成提交的代码,但又不想提交,一方面是因为代码没有完成,一方面是因为这样会在log中打印许多无用的日志信息。但是不提交就无法切换分支,于是git便开辟出来一个临时的仓库,这个仓库可以暂时存放最新修改过的代码。
git栈,可以存放多次修改,切换分支后这些存放的修改还在。
工作区--------暂存区--------本地仓库
\
\
\----git栈
git stash
保存当前的工作进度,会分别对暂存区和工作区的状态进行保存。保存后工作区恢复到之前最后一次提交的状态
git stash list
显示进度列表。此命令显然显示了git stash 可以多次保存工作进度,并在恢复时候选择。
git stash pop [--index] []
如果不使用任何参数,会恢复最新保存的工作进度,并将恢复的工作进度从存储的git栈列表中清除。
如果提供参数(来自git stash list显示的列表),则将工作进度恢复。恢复完毕也将从git栈删除工作进度。
git stash [save [--patch] [-k|--[no]keep-index] [-q|--quiet] []]
这条命令实际上是第一条git stash命令的完整版。
使用参数--patch会显示工作区和HEAD的差异,通过对差异文件的编辑决定在进度中最终要保存的工作区的内容,通过编辑差异文件可以在进度中排除无关内容。
使用-k或者--keep-index参数,在保存进度后不会将暂存区重置。默认会将暂存区和工作区强制重置。
git stash apply [--index] []
除了不删除恢复的进度之外,其余和git stash pop 命令一样。
git stash drop []
删除一个存储的进度。默认删除最新的进度。
git stash clear
删除所有存储的进度。