Git命令
Git对同一个版本库可以有多个分支,可以在不同的分支下工作,HEAD指向当前分支。当在某个分支工作时,文件系统将呈现该分支的文件,对于新创建或者新创建且已经加到暂存区的文件,任何分支都可以看到该文件。只要不切换,下次在当前目录运行Git时还是处在这个分支,还是这个状态。每次本地提交给当前分支,都会产生一个commit id,且只会对该提交分支起作用,其他分支内容没变化。Git在本地维护一个版本库,文件必须是文本文件,可以把本地库推送到远程库,或者把远程库克隆到本地,拉取远程的更新。
一、操作本地仓库
1.1 安装git
sudo apt-get install git
1.2 在当前目录下创建一个本地版本库,并默认生成master分支
git init
1.3 添加工作区的文件到暂存区
同一个文件可以多次修改,可以反复添加
git add file_name
1.4 查看工作区的文件和本地版本库的文件的内容差异
git diff file_name
1.5 撤消暂存区的文件
git reset file_name
1.6 撤销工作区文件的修改
工作区的文件回到最近一次add或者commit状态,最近的修改可能被丢弃。工作区误删的文件可以利用此命令恢复。版本库没有记录的文件不能撤销。
git checkout -- file_name
1.7 删除本地版本库的文件
最后有要commit。
对于文件:
git rm file_name
对于目录,递归删除:
git rm -r dir_name
1.8 提交暂存区的文件到本地版本库的当前分支,并附带注释
提交后,暂存区没有文件。
git commit -m “message”
1.9 查看工作区和暂存区文件的状态
git status
1.10 查看提交记录
git log --pretty=oneline
1.11 查看所有命令提交记录
git reflog
1.12 本地版本库回到某个版本
某个版本:
git reset --hard commit_id(开头7位)
上一个版本:
git reset --hard HEAD^
上面两个均会删除误提交的内容。下面的命令不删除当前提交的代码,会退到工作区,这样再次git add/commit后又得到相同的内容,默认是--mixed
git reset HEAD^
1.13 忽略工作区中的文件
在工作区新建一个.gitignore文件,并写入文件名或目录名:
*.class
*.py
注意.gitignore也要提交到版本库中。
强制添加某个文件:
git add -f file_name
二、操作分支
创建分支的目的是为了完成某一项独立的工作,分支最终要合并到主分支上,然后删除掉。
2.1 在当前分支上创建分支
以当前分支的提交点为起点
git branch branch_name
2.2 切换分支
git checkout branch_name
2.3 创建并切换分支
git checkout -b branch_name
2.4 删除分支
git branch -d branch_name
2.5 强制删除没有被合并的分支
git branch -D branch_name
2.6 查看当前是哪个分支
当前分支带有*
git branch
2.7 合并指定分支到当前分支(fast-forward)
不用加-m “messag", 快速移动只是移动指针不会提交
git merge branch_name
2.8 合并分支并提交信息
fast-forward没有相应的分支信息,可能看不出当时有其他分支存在。
git merge --no-ff -m “message” branch_name
这样会有多一次message的提交信息。
2.9 合并时出现冲突,手动解决冲突再提交
合并的两个分支修改了同一个文件的同一行内容,此时出现冲突,冲突文件有===或者<<<或者>>>。先add,再commit。如下,<<<HEAD到=====表示当前分支,====到>>>>表示远程分支。
<<<<<<< HEAD
/**
* ok的status = 0, message = null
* @param data
* @return
*/
public static Result ok(final Object data) {
return new Result() {
=======
public static Result ok(final Object data) {
return new Result() {
>>>>>>> 3c4a53e66edac603fb5b475e1de9db536d9e9ec7
2.10 查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
三、 保存分支现场
当在某个分支做了修改时,一般情况下,我们无法切换到其他分支,会提示必须先对该分支的修改进行处理。这时我们可以先保留现场,然后再切换到其他分支,最后再切回来继续处理。
3.1 保存某个分支的现场
git stash
3.2 查看stash
git stash list
3.3 恢复stash现场,并删除
git stash pop
四、上传本地仓库到GitHub
首先使用SSH加密,在用户主目录下生成公钥.ssh/id_rsa和私钥.ssh/id_rsa.pub。
ssh-keygen -t rsa -C “your email”
然后在GitHub添加公钥的内容。因为GitHub需要通过公钥确定推送者的身份。GitHub上的文件任何用户都可以看,但只有加了公钥的用户能修改。
4.2 关联本地已有仓库和GitHub上新建的空仓库
注意,我的公钥必须在用户名的信任列表中。GitHub上的远程仓库目录必须手动建好。在本地库下添加README.md,这样GitHub会展示README.md的内容。这时远程仓库的名字是origin,而且origin指向git@github.com:用户名/仓库名.git。用ssh来连接。
git remote add origin git@github.com:用户名/仓库名.git
4.3 推送本地仓库到远程仓库
git push -u origin master
push将该分支上的所有提交记录(commit id)推送到远程库。-u的作用是关联两个master,这样git pull时就会知道track信息,知道从远程的哪个分支拉取内容。下次push可以把-u去掉。
五、克隆GitHub上的仓库到本地
5.1 克隆远程仓库
GitHub上已有内容的仓库,在本地clone出对应的仓库,这时本地master和远程master对应,已经track。远程仓库的名称默认是origin。
git clone git@github.com:用户名/远程仓库名.git
5.2 显示origin的地址
git remote -v
5.3 创建分支并与远程分支对应
克隆远程仓库后本地只有一个master分支,其他分支的内容一概不知。通常还要建立对应远程其他分支的本地分支,下面命令已经track。然后再拉取该分支的内容git pull。
git checkout -b dev origin/dev
5.4 建立本地分支和远程分支的对应
pull提示没track时,使用此命令。在第一次push时使用-u选项track,无需用此命令。track对应的远程分支,即从哪个分支跟当前分支合并。拉取远程分支时,先使用下面的命令:
git branch --set-upstream-to=origin/dev dev
然后再使用
git pull
在仓库的根目录下运行下面的命令,可以发现添加了本地分支和远程分支的对应信息。
cat .git/config
这时,该文件里添加了如下内容:
[branch "dev"]
remote = origin
merge = refs/heads/dev
六、push出错,本地和远程合并
6.1 远程比本地新时,先pull,解决冲突
必须有track记录,远程分支会跟当前分支合并。
git pull
6.2 再push
git push origin dev
6.3 在GitHub上fork其他账户的仓库
点击fork即可。然后自己的账户下就有了该库的副本。这时我们可以在自己的账户下pull和push该库。
参考博客:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000