1、下载资源
软件:Git-2.10.0-64-bit.exe(win64)
学习资料:https://git_scm.com/book/zh/vz
https://git_scm.com/book/en/vz
2、your ID
$ git config --global user.name "sheng"
$ git config --global user.email shengxxxx@163.com
3、基本指令
$ git init 创建本地仓库
$ git add *.c *.h 跟踪指定对象
$ git add README 建立跟踪文件名README
$ git commit -m 'inital project version' 提交更新并注释
$ git commit -m 'log' -a提交更新并注释 -a:add
$ git atatus 查看已被跟踪文件状态
4、应用指令
$ git diff -staged比较当前文件和暂存区域之间的差异
$ rm README 移除文件
$ git rm README 记录移除文件操作
$ git rm --cache README 保留文件在磁盘,但不想让git继续跟踪
$ git mv file_old file_new修改跟踪文件名
$ git reset HEAD README取消暂存的文件
$ git checkout --README 撤销对文件的修改
5、查看提交历史
$ git log 查看提交的历史
$ git log -p -2 -p:显示每次提交内容的差异 -2:显示最近两次提交
$ git log --stat 查看每次提交的简略的统计信息
6、删除仓库
$ find . -name ".git" | xargs rm -Rf
7、忽略不需要跟踪文件
-1、建立:$ vim .gitignore
建立 .gitignore文件,打开文件,填入下述语法
如需忽略文件:*.o *.d *.cppxxxx.*
如需忽略文件夹:test/*
-2、配置语法:
以斜杠“/”开头表示目录;
以星号“*”通配多个字符;
以问号“?”通配单个字符
以方括号“[]”包含单个字符的匹配列表;
以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
-3、示例:
(1)规则:fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
(2)规则:/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;
(3)规则:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;
8、远程仓库
(1)添加远程仓库
$ git remote
$ git remote add test https://github.com/paul/ticgit //test指代URL
$ git remote -v
$ git fetch test //拉取远程仓库中有,而你没有的信息
$ git push origin master//推送到远程仓库
$ git remote show origin //查看远程仓库信息
(2)远程仓库移除与重命名
$ git remote rename test paultest更名为paul
$ git remote rm paul 移除该镜像
(3)克隆现有仓库
$ git clone https://github.com/libgit2/libgit2
9、创建分支
$ git branch testing//创建 但HEAD还在master
$ git checkout testing//切换到testing分支
$ git checkout master//切换到master
10、删除已跟踪文件
如果文件已经被跟踪且被推送到远程,可以按照下面方法解决:
rm -rf 文件
git rm -r --cached 要忽略的文件
git add -A (添加所有)
git push origin 分支
如果同名的文件过多,如:.class 文件被提交了,那么如果这样一个一个显然效率太低,可以按照下面方法操作
find . -iname 文件名 -exec rm -rf {}\;
- 重复上面的步骤,文件名替换为下一个要删除的文件名
- 修改gitignore,添加忽略文件
git rm -r --cached 要忽略的文件
git add -A
git push origin 分支
---------------------------------------------------------------------------------------------------
git使用实例记录
-------------------------------------------------------------------------------
1、修改文件的提交(转)
比如你在仓库目录下的其中一个文件夹file1中修改了一个.C文件
$ git add file1 //路径注意不要add错了,必须是当前.git可见的路径,在此时的bash下只可见file1,不可见.c文件。
$ git commit -m 'your commit'
这样就完成修改和提交工作了。
查看各提交历史:
$ git log --pretty=oneline //会出现各提交记录版本号以及你的commit
2、版本回退
参:http://blog.csdn.net/zhang31jian/article/details/40982161
回退到上一个版本号显示:
$ git log --pretty=oneline
$ git log --pretty=oneline //1
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset
命令:
$ git reset --hard HEAD^ //2 回退到前一个版本
HEAD is now at ea34578 add distributed
在Git中,用
HEAD
表示当前版本,也就是最新的提交
3628164...882e1e0
(注意我的提交ID和你的肯定不一样),上一个版本就是
HEAD^
,上上一个版本就是
HEAD^^
,当然往上100个版本写100个
^
比较容易数不过来,所以写成
HEAD~100
。
$ git reset --hard 3628164 //3 回退到指定版本
HEAD is now at 3628164 append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
现在总结一下:
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。 //4 找出回退的版本号,以便吃后悔药
3、分支管理
(1)、建立分支
$ git branch dev
(2)、查看分支
$ git branch -a // 此时HEAD指针仍指向master
(3)、切换并创建新分支
$ git checkout -b dev //git checkout命令加上-b参数表示创建并切换分支上
(4)、查看切换的分支
$ git branch -a
git branch -a 命令可以查看所有分支,现在我们HEAD指针便指向dev分支,大家可以在上图中看到dev分支上有个*号。
(5)、切换到master
$ git checkout master //cat test.txt 显示test.txt中的内容
(6)、合并分支
$ git merge dev //合并dev分支修改内容到master主干上,注:操作的HEAD指针先指向master
(7)、删除分支
$ git branch -d dev //删除dev分支
查看一下:git branch -a 发现只有master这一个主分支了。
(8)、总结指令
- 查看分支 git branch -a
- 创建分支 git branch name
- 切换分支 git checkout name
- 创建并切换 git checkout -b name
- 合并某分支到当前分支 git merge name
- 删除分支 git branch -d name
后再提交。
(9)、分支合并冲突
Git告诉我们readme.txt文件存在冲突,必须手动解决冲突后再提交。
用到的指令:
创建分支并修改内容
$ git checkout -b dev1 //切换并创建分支dev1 以下在dev1分支上
$ vim test.txt //创建文本并编辑
$ cat test.txt //查看文本内容
$ git add test.txt //添加到git
$ git commit -m 'add test.txt' //提交
切换到master合并分支test.txt
$ git checkout master
同上建立一个test.txt文档并添加内容
$ git merge dev1
合并失败,手动修改后合并
删除dev1分支
$ git branch -d dev1
用 git log --graph --pretty=oneline --abbrev-commit 命令,查看一下分支合并
(10)、分支与分支合并
$ git merge --no--ff -m "test" dev //合并dev
--no-ff参数表示禁用快速合并
下面我们来说一下一般企业中开发一个项目的分支策略:分支命名
- 主分支 master
- 开发分支 develop
- 功能分支 feature
- 预发布分支 release
- bug 分支 fixbug
- 其它分支 other
4、开发协作(远程仓库)
------------参:http://www.oschina.net/question/31384_157479
(1)、查看远程仓库
$ git remote //查看远程仓库
$ git remote -v //加-v选项可以查看详细信息
(2)、分支推送
$ git push origin master //本地master分支与远程的master分支已同步
$ git push origin dev //同步dev分支
本地有很多分支,有哪些分支需要推送到远程仓库中呢?一般是这样的,
- master 分支是主分支,要时刻与远程同步,一般我们发布最新版本就用master分支
- develop 分支是开发分支,团队中所有人都在这个分支上开发,所以也需要与远程同步
- bug 分支一般只在本地使用来修复bug,一般不需推送远程仓库中
- feature 分支是否需要推送到远程,要看是不是有几个人合作开发新功能,如果你是一个开发,那就留在本地吧
- release 分支一般是系统管理,推送或抓取的分支一般与开发人员无关
- other 分支大家按需求分配
(3)、本地分支与远程分支进行链接
$ git branch --set--upstream dev origin/dev //将dev分支与远程origin/dev分支进行链接
$ git push //git pull 成功,但是合并有冲突需要手动解决,解决的方法和分支管理中的解决冲突完全一样。
总结:
多人开发模式:
1)试图用git push origin branch-name推送自己的修改如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并如果合并有冲突,则解决冲突,并在本地提交没有冲突或者解决掉冲突后。
2)再用git push origin branch-name推送就能成功如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
5、远程操作
参:http://www.ruanyifeng.com/blog/2014/06/git_remote.html
1)列出远程主机
$ git remote
$ git remote -v //-v参考远程主机网址
克隆版本库的时候,所使用的远程主机自动被Git命名为origin
。如果想用其他的主机名,需要用git clone
命令的-o
选项指定。
$ git clone -o [your name] https://xxxxxxxxx
2)远程操作基本指令
git remote show
命令加上主机名,可以查看该主机的详细信息。
$ git remote show <主机名>
git remote add
命令用于添加远程主机。
$ git remote add <主机名> <网址>
git remote rm
命令用于删除远程主机。
$ git remote rm <主机名>
git remote rename
命令用于远程主机的改名。
$ git remote rename <原主机名> <新主机名>
3) git fetch
将远程主机的更新全部取回本地,查看其他人的进程,对本地的开发代码没有影响。
--1)取回资源
默认取回所有分支代码,可以指定取回:
$ git fetch <远程主机名(origin)> <分支名(master)>
$ git branch -r //查看远程分支
$ git branch -a //查看所有分支
--2)建立分支
直接创建远程分支:
$ git checkout -bnewbranch origin/master //在origin/master
的基础上,创建一个新分支
在本地创建合并到远程分支:
$ git merge origin/master //在当前分支上,合并origin/master
4) git pull
--1)基本合并指令
$ git pull <远程主机名> <远程分支名>:<本地分支名>
举例:$ git pull origin next:master //取回origin主机的next分支,并与本地的master合并
$ git pull origin next //如果远程分支是当前分支合并,则冒号后面的部分也可以省略
--2)建立本地与远程追踪关系
$ git branch --set-upstream master origin/next
//
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull可以省略远程分支名:
$ git pull origin //本地的当前分支自动与对应的远程origin主机追踪分支进行合并。
$ git pull //如果当前分支只有一个追踪分支,那么远程主机名(origin)也可以省略
--3)删除不存在远程对应分支的本地分支
如果远程主机删除了某个分支,默认情况下,git pull不会在拉取远程分支的时候,删除对应的本地分支。
如果要删除不存在远程对应分支的本地分支,可以用以下指令:
$ git pull -p
#等同于下面命令:
$ git fetch --prune origin
$ git fetch -p
5)git push
将本地分支的更新推送到远程。
$ git push <远程主机名> <本地分支名>:<远程分支名>
举例:
---1、如果省略远程分支名,表示本地分支推送与之存在追踪关系的远程分支,如果远程分支不存在,则会被新建。
$ git push origin master //将本地的master分支推送到远程主机,若远程主机分支不存在,则会新建。
---2、如果省略本地分支名,则会删除指定的远程分支,因为等同于推送一个空的本地分支到远程分支。
$ git push origin :master
#the same
$ git push origin --delete master //删除远程主机的master分支
---3、如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略。
$ git push origin //将当前分支推送到origin主机的对应分支
---4、如果分支只有一个分支,那么主机名也可以省
$ git push
---5、如果本地分支与多个主机存在追踪关系。
$ git push -u origin master
---6、不管是否存在远程分支,将本地的所有分支都推送到远程主机。
$ git push --all origin
---7、如果远程主机的版本比本地版本更新,push会报错,可以强制推送。
$ git push --force origin