理清两种git仓库:
(1)本地仓库:可以是本机使用的仓库,不放到网络;可以作为服务器仓库,放到网络;可以是远程克隆下来的仓库;
(2)远程仓库:远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。
一、对本地git操作:
(1)本地创建一个git仓库:
git init
(2)添加文件到仓库:
git add xxx
(3)提交放入暂存区的所有操作:
git commit
(4)本地克隆一个远程仓库:
git clone <name> <url> <directory>
# name可以不写,默认是origin
# directory可以不写,默认使用远程git一样的根目录名
(5)检查当前git库的状态信息:
git status
(6)删除git中的文件
git rm xxx
(7)移动文件/重命名文件
git mv file_from file_to
# 相当于执行了下面三个操作:
# mv file_from file_to
# git rm file_from
# git add file_to
# 注意用命令重命名和直接重命名不一样!用命令很聪明!
(8)查看提交历史
git log
# 可以使用gitk命令,用图形化工具查看提交历史,相当于git log命令的可视化版本
二、本地git与远程git的操作:
(1)添加一个远程仓库:
git remote add <name> <url>
# name 可以不写,默认是origin
# url必须是存在的远程git仓库
(2)查看当前的所有远程仓库
git remote
# 可以加上-v现实对应的url,git remote -v
(3)查看远程仓库的信息
git remote show xxx
# xxx是远程仓库的名字
(4)重命名远程仓库
git remote rename name_from name_to
(5)删除远程仓库
git remote rm xxx
# xxx是远程仓库的名字
# 使用情境:碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,或者某个参与者不再贡献代码,又或者不想关联远端仓库,那么需要移除对应的远端仓库,就可以运行 git remote rm 命令。
(6)推送数据到远程仓库:
git push <remote name> <branchname>
# 会推送上一次push后新commit的所有的快照(个数>=1)给远程仓库。
#:一旦进入了本地的某个git中,对该库中的任何操作都会记录下来,此时git status会提醒需要进行哪些操作以备进行commit提交,请一定要确认还有什么修改过的或新建的文件还没有 git add 过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit。
为了避免对每一个文件的更改都要重新git add xxx,在git commit,替代的操作是只使用一次git commit -a操作!例如更改了源文件demo1.cpp的内容,会提醒是否进行git add demo.cpp操作,同时更改源文件demo2.cpp,也会提醒是否进行git add demo2.cpp操作。此时若使用命令git commit -a就会提交所有类似上面的操作记录,不用每一个文件都去git add了。
但是,重命名文件(不用命令方式的重命名,即没有使用git mv命令)不能通过git commit -a实现提交,必须将新名字的文件git add,再git commit。例如,将demo1.cpp重命名为demo2.cpp,同时还有对其它文件的更改,使用git commit -a命令后,再git push后查看远程仓库,会发现demo1.cpp确实没了,但没有demo2.cpp。
小结:重命名文件(没有用命令的重命名,这时重命名就等于删除了源文件,新建了另一个和源文件内容一样的文件)一定要确保进行了git add后,git commit才对这个文件的提交有效,才有后续的git push!
(7)同步远程仓库到本地:
有两个命令可以使用,git fetch+git merge和git pull,注意区别。
第一种同步远程仓库数据到本地:git fetch+git merge
git fetch:相当于是从远程获取最新版本到本地,不会自动merge
使用方法:
git fetch <远程主机名>
将某个远程主机的更新,全部取回本地。默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名,比如,取回origin主机的master分支:
git fetch <远程主机名> <分支名>
例如:
git fetch origin master
git merge origin/master
# 含义:从远程origin主机的master主分支获取最新的版本到本地,把origin/master分支与当前分支进行合并。在两个命令中间我们还可以通过git diff命令比较差异,判断是否进行合并。
第二种同步远程仓库数据到本地:git pull
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
git pull origin next:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
git fetch origin
git merge origin/next
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。
Git也允许手动建立追踪关系。
git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用–rebase选项。
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
(8)分支管理:
创建分支:
git branch new_branch
查看分支:
git branch
所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。
git checkout branch-name
移到branch-name分支处,you should commit any outstanding changes on one branch before switching to a different one
创建和切换分支组合命令:
git checkout -b new_branch
应用:
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支:
git checkout -b lab2 origin/lab2
上面命令表示,在origin/master的基础上,创建一个新分支lab2。
此时在lab2分支,若执行下面指令:
git merge lab1
则将lab1分支的内容改动整合到lab2中