cd ~/桌面/ 切到家目录的桌面文件夹下
mkdir test_project 创建一个test_project的空文件夹
cd test_project 切到test_project目录下
git init 将当前目录初始化为一个git仓库
ll 查看当前test_project下目录下的文件
ll .git 查看.git目录下的文件
touch test1.txt test2.txt test3.txt 创建三个测试文件
mkdir ignoreDir 创建一个文件夹,用来测试git ignore
touch ignoreDir/ignoreFile1.txt
git status 查看当前git仓库的各种状态信息。现在新建的几个文件都还没有被git跟踪,不是版本文件
git add . 将所有非版本文件添加进git,将所有版本文件的改动添加到暂存区,当然git add 后面也可以跟单个文件,或者通配符。运行后执行git status
git rm -r --cached ignoreDir/ 将ignoreDir文件夹下面的所有文件移除版本控制,这里加了-r表示递归删除。当然也可以不加-r,直接移除单个文件,或者使用通配符。然后git status,会继续提示ignoreDir/不是版本文件
ignoreDir目录下面的文件夹是我们不想进行版本控制,可以创建一个.gitignore文件,配置忽略的文件,在JavaWeb开发中,maven项目中的target目录,日志文件,集成开发环境生成的配置文件等都需要配置为不需要跟踪
touch .gitignore
vim .gitignore 添加ignoreDir为git忽略的文件
保存后 git status
git add .gitignore 将.gitignore添加到版本文件
git commit -m "[add]添加test1~test3三个测试文件,添加.gitignore文件" 提交到本地仓库
git log 查看当前分支的提交记录,也已在后面接分支名 比如 git log branch_1. 可以看到当前分支的HEAD在上一次提交上,8b9a981......这一串数字是一次提交的id
vim test1.txt 在test1.txt中添加一行 "test1的第一行"
vim test2.txt 在test2.txt中添加一行 "test2的第一行"
git diff 比对工作区和暂存区之间的差异, git diff [path] 比对指定路径的差异
git diff [commit-id] [path] 比对指定提交和工作区的差异
git diff --cached [commit-id] 比对指定提交和暂存区的差异
git diff [commit-id] [commit-id] 比对两次提交之间的差异
git add . 将test1.txt和text2.txt的改动添加到暂存区
git reset HEAD test2.txt 将test2.txt的修改移除暂存区
git commit -m "[add]在test1.txt中新加了一行" 将test1.txt的修改提交
git add . 将test2.txt的修改添加到暂存
git commit -m "[add]在test2.txt中新加了一行" 将test2.txt的修改提交, 这时候已经有三次提交了,git log可以看到提交记录
git rebase -i HEAD~2 将两次最近的两次提交压缩为一个提交。
rebase命令还用于分支合并,两个分支合并,或者本地分支和远程分支合并(git pull如果本地分支和远程分支存在分叉,就会自动合并),合并过程中会产生一次新的提交,让提交记录不那么清晰明了,使用rebase可以避免分叉,让提交是线性的。但是rebase可能会改变原有的提交,如下图所示,rebase后,c5这次提交直接在c4基础上了,无法还原c5这个提交。在开发过程中,合并分支最好不要用rebase,在自己单独的分支开发的时候,可以考虑使用rebase压缩提交。
将cef9c4b的提交前面的 pick改成 s,表示将这次提交压缩到它的父提交,修改完后保存,会跳转到一个编辑注释的页面,写完注释后保存,然后git log,可以看到之前HEAD和HEAD前面的一个提交被压缩成了一个新的提交
mkdir ../test_project_local 创建一个和test_project同级的目录
cd ../test_project_local 切到刚才创建的目录
git clone /home/fengxing/桌面/test_project 将test_project的git仓库克隆到当前路径
cd test_project 切换到刚刚clone的git仓库,把test_project_local下面的仓库作为本地仓库,test_project下面的仓库作为远程仓库
git checkout -b branch_1 origin/master 基于远程的master分支创建一个名为branch_1的分支
这个命令相当于 git branch branch_1 origin/master + git checkout branch_1 ,先创建一个分支,然后切换到创建的那个分支. branch_1的远程分支是master分支,需要将跟踪的远程分支设置为同名的分支
git push --set-upstream origin branch_1 将当前分支跟踪的远程分支设置为远程的branch_1分支
或者使用git push -u origin branch_1
git branch -a 查看当前所有的分支
在branch_1分支上在test.txt中添加一行, "本地的branch_1分支在test1.txt中增加一行"
在branch_1分支上在test2.txt中添加一行, "本地的branch_1分支在test2.txt中增加一行"
git checkout test2.txt checkout除了切换分支,还可以用来丢弃工作区的修改(感觉git命令的设计有点混乱),执行这个命令后上一步对test2.txt的修改留丢失了
git add .
git commit -m "[add]本地的branch_1分支在test1.txt中增加一行"
git checkout master
在master分支的test.txt文件也添加一行, "本地的master分支在test1.txt中增加一行"
git commit -m "[add]本地的master分支在test1.txt中增加一行" 这时候本地的master分支领先远程master分支一个提交
git tag -a matser_test1_add_one_column_tag -m "本地的master分支在test1.txt中增加一行" 给上一次提交打了一个标签,tag相当于一种标记,这里打标记是为了后面回退版本方便,在实际开发中,可以用tag标记项目的版本叠代
git tag -a [tag名] [commit-id] -m [tag的注释] 没有commit-id默认用当前的头创建tag
git tag 查看所有的tag
git show [tag名] 显示一个tag的详细信息
git push origin [tag名] 将tag推送到远程
git tag -d [tag名] 删除本地tag
git push --delete origin [tag名] 删除远程tag
git reset --hard origin/master 将本地master分支回退成和远程master分支一样, origin/master表示一次提交,这里origin/master就是本地master的上一个提交,当然也可以直接用commit-id表示,等价于
git reset --hard 0d3630028f484918316d9eacfcc9c3c36c51ca6a
--hard 回退到版本之后的修改直接丢失
--soft 回退版本之后的修改到暂存区
--mixed 到工作区
git reset --hard matser_test1_add_one_column_tag 再重置回来,将master分支的头放到matser_test1_add_one_column_tag上
git merge branch_1 当前在master分支,这表示将branch_1分支合并到master分支,branch_1分支不会做任何改变,由于master和branch_1都改变了test.txt文件,所以合并会有冲突
vim branch_1 解决冲突后 add , commit再次提交
git add .
git commit -m "[merge]合并branch_1到master,解决了test1的冲突" 这里可以看到,合并分支会产生一次提交,在开发过程中因为分支合并会产生合同多余的提交
git push origin master 推送到远程的master分支,origin是远程仓库的别称
git remote -v 查看配置的远程仓库的信息
git remote add [远程仓库名] [远程仓库地址] 添加远程仓库
git remote rm [远程仓库名] 删除远程仓库
push的时候报这个错误,百度一圈也没弄明白怎么回事
很多地方说在远程仓库的.git/config中加入
[receive]
denyCurrentBranch = ignore
如:http://blog.sina.com.cn/s/blog_5dc29fcc01011hvr.html
直接git push 默认将当前分支推送到远程同名的分支,
如果当前分支在master,运行git push origin branch_1, 会把 本地branch_1的提交推到远程branch_1。
push的时候如果本地分支落后远程,推送将被拒绝,需要先pull
当本地分支和要推送的远程分支不同名时,可以指定远程分支名
git push origin HEAD:[远程分支名]
git pull 从远程分支拉代码,git pull后面也可以接分支名,不跟分支名默认从当前跟踪的分支拉代码。
git pull相当于git fetch + git merge,当本地分支和远程分支之间存在分叉的时候,会自动做一次merge,merge过程中出现冲突会提示解决冲突。