1. 基本操作
全局配置:
git config --global user.name xx
git config --global user.email xxx
初始化一个仓库:
git init
添加:
git add "file1.txt"
git commit -m "添加文件1"
比较:分别列出每个文件的当前内容与其最近一次提交的差异
git diff file1 file2 file3 ,工作区和暂存区的比较
git diff --cached file1 file2 file3 ,暂存区和仓库比较
查看某次提交做的修改:
git show ${commit_id}
创建新仓库 / 将已有未被管理的项目加入到某个仓库 / 将已有已被管理的项目加入到另一个仓库:
2. 分支管理
创建分支: git branch 新分支名 [源分支名]
删除分支: git branch -d 分支名
切换分支: git checkout 分支名 ,或 git checkout -b 新分支名 [源分支名] ,后者为从指定源分支(默认为master)创建并切换分支
查看分支(假设远程和本地库中都只有master分支,远程主机名在本地被取为origin):
- 查看本地: git branch ,得到master
- 查看远程分支: git branch -r ,得到origin/master
- 查看本地和远程的所有分支: git branch -a ,得到master和remotes/origin/master两条记录
取回远程主机分支: git fetch 远程主机名 [分支名] ,如git fetch origin master。若没有指定分支名则取回所有分支的更新;取回分支只是将远程主机版本库的更新取回,对本地分支没影响;所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取
合并分支: git merge [--no-ff] 被合并分支名 ,将指定分支合并到当前分支。不含--no-ff参数时,Git执行快进式合并,直接将当前分支指向被合并分支;带该参数时会执行正常合并,在Master分支上生成一个新节点。
关于创建与合并分支的原理,可见创建与合并分支-廖雪峰、Git分支管理策略-阮一峰
3. 查看状态
命令: git status
查看commit记录: git log [--pretty=oneline] ,这里加后面参数可以减少不相关信息的输出,从而输出每次修改的commit_id和注释。如 8ebc1882fa63e8048a8ad983e9de7fa413f54580 add file test.txt
查看commit和reset等记录: git reflog ,其可查看所有分支的所有操作记录(包括commit和reset的操作及已经被删除的commit记录,git log则不能察看已经删除了的commit记录),其会列出每种操作完后的commit_id串的前几位。
查看提交图: git log --graph --pretty=oneline --abbrev-commit ,结果示例:
4. 版本回退
(参考自Git版本回退操作)
git reset --hard commit_id
- 这里版本号可以不全写会根据已写的自动查找;
- 除了用commit_id外,也可用特殊标记:Git用 HEAD 表示当前分支的最新版本、 HEAD^ 表示上版本、 HEAD^^ 表示上上版本、 HEAD~100 表示往上100个版本以此类推;
- 回退后,HEAD的指向也变成当前的最新版,可能造成往历史版本回滚后滚不回真正的最新版,如对于版本号为1到10的十个版本,回滚到版本5后HEAD就是版本5了此时滚不回10。解决:可以通过git reflog查看版本10提交时的commit_id从而滚到最新版。
5. 远程管理
(参考自Git远程操作详解-阮一峰)
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区(即stage或index)的概念。
git clone
git fetch
git pull
git push
git remote
git clone
git clone <版本库的网址> [<本地目录名>] ,从远程主机克隆一个版本库。
- 该命令会在本地主机生成一个目录,不指定名称的话与远程主机的版本库同名;
- Git要求每个远程主机都必须指定一个主机名,默认为origin,可以通过-o参数指定,如 git clone -o jQuery https://github.com/jquery/jquery.git ,此外可以通过 -b 指定克隆版本库的指定分支。
- git clone还支持HTTP(s)、FTP、SSH、file等协议,如 git clone file:///opt/git/project.git
git fetch
git fetch 用法见上面的分支管理部分。
git pull
git pull <远程主机名> <远程分支名>[:<本地分支名>] :从指定远程主机的某个分支拉取更新并合并到指定的本地分支,如 git pull origin next:master 将origin/next分支更新拉取并合并到本地master分支。
- 若未指定本地分支时默认为当前分支,如 git pull origin next 取回origin/next分支并与当前分支合并,相当于 git fetch origin/next、git merge origin/next两步操作。
- 若当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名,如git pull origin。
- 在git clone时所有本地分支默认与远程主机的同名分支,建立追踪关系,也即本地的master分支自动"追踪"origin/master分支。
- Git也允许手动建立追踪关系,如git branch --set-upstream master origin/next指定
master
分支追踪origin/next
分支。
- 若当前分支只有一个追踪分支,连远程主机名都可以省略,如 git pull
git push
git push <远程主机名> <本地分支名>:<远程分支名> :将本地分支的更新,推送到远程主机,如 git push origin master:next 将本地master分支推送到远程origin主机的next分支上。
- 省略远程分支名表示将本地分支推送到与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。如 git push origin master 将本地的
master
分支推送到origin
主机的master
分支。 - 省略本地分支名表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。如 git push origin :master 等同于 git push origin --delete master ,表示删除
origin
主机的master
分支。 - 若当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。如 git push origin 将当前分支推送到
origin
主机的对应分支。 - 若当前分支只有一个追踪分支,那么主机名都可以省略。如 git push
- 若当前分支与多个主机存在追踪关系,则可使用
-u
选项指定一个默认主机,如 git push -u origin master 将本地的master
分支推送到origin
主机的master分支,同时指定origin
为默认主机并将两分支关联起来,在以后的推送或者拉取时就可以不加任何参数使用git push
了。
git remote
git remote :管理远程主机名
- 不带参数时,列出所有远程主机
- -v参数,列出所有远程主机及网址
- git remote show <主机名> ,查看某远程主机信息
- git remote add <主机名> <网址> ,添加远程主机
- git remote rm <主机名> ,删除远程主机
- git remote rename <主机名> ,重命名远程主机
GtiHub不适合作为个人不愿公开的项目的托管,可以使用Gitlab。
为Gitlab账号添加SSH key并使用Git连接Gitlab(为GitLab帐号添加SSH keys并连接GitLab):有两种方式从Gitlab上clone项目,http和ssh。
- 前者每次clone、push等操作都需要用户输入账号的用户名和密码,比较麻烦;
- 可以使用后者并配置SSH Key来避免这种麻烦。其实本质上使用SSH也需要输入账号和相应密码,但我们通过生成并添加SSH Key使得在clone等操作时计算机帮我们做了身份验证的事。(且由于生成了公钥和私钥并把公钥放到了Gitlab上,它们相当于一对锁和钥匙,在连接时进行公钥和私钥的匹配,所以用SSH方式不需要知道账号的密码了,在生成SSH Key时提示设置的密码也不是账号的密码,而是push操作时的密码,可以不设置,这样以后clone等操作都不需要输入密码了)
6. 其他
修改已经commit的comment
修改最近一次提交:
git commit --amend 可以修改最近一次提交的注释信息。详情参阅:https://stackoverflow.com/questions/179123/how-to-modify-existing-unpushed-commits
修改指定某次的历史提交:
https://xiewenbo.iteye.com/blog/1285693