Git初始化及仓库的创建和操作
一、基本信息设置
git config --global user.name 'xxx'
git config --global user.email "[email protected]"
git config --list //查看当前配置
二、创建git仓库和初始化仓库
1、选择一个合适的地方,创建一个空目录
mkdir file //mkdir创建文件夹
cd file
pwd //pwd命令用于显示当前目录。
git init
git init file //上面4步可以写成这2步
cd file
2、向仓库添加文件。如:编写一个readme.txt文件
touch readme.txt //touch 创建新的空文件
git add readme.txt //添加到暂存区
git commit -m "提交描述" //从暂存区添加到仓库
git status //查看状态
git add . //把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件
git add -u //提交被修改(modified)和被删除(deleted)文件,add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A //是git add . 和 git add -u两个功能的合集(git add --all的缩写)
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
在图形化界面ctrl+h就可以显示
(git status 查询仓库的状态. 显示当前工作目录状态)
vi readme.txt
//使用vi加文件路径(或文件名)的模式打开文件,如果文件存在则打开现有文件,如果文件不存在则新建文件,并在终端最下面一行显示打开的是一个新文件。
cat readme.txt //cat 命令用于连接文件并打印到标准输出设备上。
xxxx输入内容
git add readme.txt //添加到暂存区
git commit -m "提交描述" //从暂存区添加到仓库
git status
git diff //不加参数即默认比较工作区与暂存区
git diff --cached //比较暂存区与本地仓库区
git diff HEAD //比较工作目录与本地仓库区
git diff HEAD -- readme.txt //可以查看工作区和版本库里面最新版本的区别
git checkout -b b master //基于maser创建b分子
cat filename //查看工作区内容
git cat-file -p :filename //查看暂存区内容
git cat-file -p branch:filename //查看某分支本地仓库内容
git ls-files -s //查看暂存区有哪些文件
git ls-tree master //查看commit树有哪些文件
ll //查看工作目录有哪些文件
git revert
撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
版本会递增,不影响之前提交的内容
git revert HEAD //撤销前一次 commit
git revert HEAD^ //撤销前前一次 commit
git revert commit //(比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git checkout .或git checkout filename //暂存区内容覆盖到工作区
git checkout HEAD .或git checkout HEAD filename //本地仓库内容覆盖到工作区和暂存区
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
git log //查看历史记录 或git log --pretty=oneline
git reset --hard HEAD^ //上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
git reset --hard 3628164
总结:
git reset --hard commit_id 版本的历史之间穿梭
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
6、删除仓库文件
rm readme.txt
git rm readme.txt
git rm --cached //从缓存区移除
git commit -m "提交描述"
git status
7、GitHub 管理远程仓库
git clone 仓库地址 //将远程仓库(github 对应的项目复制到本地)
ll //查看当前文件夹下的文件有哪些
ls // //查看当前文件夹下的文件有哪些
touch a.php
git add a.php
git commit -m "提交描述"
git push //本地仓库同步到git远程仓库中
git pull //远程仓库中添加的文件同步更新到本地
无法同步或没有权限,进行下面的操作
vi .git/congig
将
[remote "origin"]
url = https://github.com/用户名、仓库名.git
修改为:
[remote "origin"]
url = https://用户名:密码@github.com/用户名/仓库名.git
7 GitHub Pages 搭建网站
个人站点:
访问
https://用户名.github.io
搭建步骤:
1)创建个人站点 -> 创建仓库(注:仓库名必须是【用户名.github.io】)
2)在仓库下新建index.html的文件即可
GitHub Pages仅支持静态网页,仓库里面只能是html文件
Progect Pages项目站点
访问
https://用户名.github.io/仓库名
搭建步骤:
1)进入项目主页,点击settings
2) 在settings页面。点击【Launch automatic page generator】来自动生成主题页面
3)新建站点基础信息设置
4)选择主题
5)生成网页
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key
$ ssh-keygen -t rsa -C "[email protected]"
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
本地Git仓库和远程仓库的创建及关联
1)github新建一个远程的仓库(空的)test
2)在本地创建一个本地的文件夹test
3)利用终端进入当前的文件夹目录 cd xxx/xxx
4)初始化这个本地的文件夹为一个Git可以管理的仓库 git init
注意:Git会自动为我们创建唯一一个master分支
我们能够发现在当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
5)将本地的仓库和远程的仓库进行关联
git remote add origin [email protected]:账户名/仓库名.git
git remote add origin https://github.com/sweetllh/test //关联
git pull origin master //拉取远程仓库的内容
6)在本地文件夹做事
1、新建文件 //touch main.m
2、将新建的main.m文件添加到仓库(这样git就会追踪这个文件) // git add main.m
3、把文件提交到仓库 // git commit -m “新建了一个man.m文件”
4、把本地库的内容推送到远程 // git push -u origin master
备注:origin:远程仓库名字; master:分支
注意:我们第一次push的时候,加上-u参数,Git就会把本地的master分支和远程的master分支进行关联起来,我们以后的push操作就不再需要加上-u参数了
5、我们用浏览器进入远程仓库中查看,发现远程仓库中也出现了mian.m文件
6、假如某天我们又对mian.m文件进行了修改(这里我们在main.m文件里面添加了一句"hello world")
7、我们可以利用git status查看状态 //git status
8、将文件添加到Git版本库,实际上就是把文件修改添加到暂存区 //git add main.m
9、提交修改,实际上就是把暂存区的所有内容提交到当前分支。 //git commit -m “添加了hello”
10、再次查看状态 //git status
11、把本地当前分支的最新修改推送至GitHub上的远程仓库 //git push origin master
12、利用浏览器在远程仓库查看,我们看到已经将本地上的修改推送到远程仓库了
13、git add . //添加所有文件
###将项目放到github上生成网页
git init
git add .
git commit -m '描述' //git commit --allow-empty -m "允许空的提交”
git remote add origin [email protected]:账户名/仓库名.git
git push -u origin master
###将项目放到github上生成网页后需要修改
1、在github上创建项目
2、使用git clone https://github.com/xxxx/xxxxx.git克隆到本地
3、编辑项目
4、git add . (将改动添加到暂存区)
5、git commit -m"提交说明"
6、git push -u origin master 将本地更改推送到远程master分支
如果githubd的 remote上已经有了文件,会出现错误。此时应当先pull一下,即
git pull origin master
分支管理 :
1、创建分支:
git branch dev //创建分支
git checkout dev //切换分支
git checkout -b dev // 相当于git branch dev git chekout dev,创建和切换分支
git branch //命令查看当前分支
git log --oneline --decorate //命令查看分支
修改文件
git add a.php
git commit -m 'branch test'
git checkout master //dev的工作完成,切换回master分支
git merge dev //把dev分支的工作成果合并到master分支上
git branch -d dev //删除dev分支
2、分支冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
git log 查看提交历史记录
git log --oneline //或者 git log --pretty=oneline 以精简模式显示,只显示当前分支的
git log --oneline --all //所有分支下的
git log --oneline --all --decorate //所有分支下的,并显示分支
git log --oneline --all --decorate --graph //图形化显示
git log --graph //以图形模式显示
git log --stat //显示文件更改列表
git log --author= 'name' //显示某个作者的日志
git log -p filepath //查看某个文件的详细修改
git log -L start,end:filepath //查看某个文件某几行范围内的修改记录
git log --stat commitId //或者 git show --stat commitId 查看某一次提交的文件修改列表
可以通过别名简化命令
git config alias.logg "log --oneline --all --decorate --graph"
git logg //配置后可以代替git log --oneline --all --decorate --graph
3、分支管理策略
git merge dev //当前分支与dev 分支合并
git merge --no-ff -m "merge with no-ff" dev //用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
git mergetool //合并工具
git branch -vv //跟踪分支
git cherry-pick //git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了,其实也就是对已经存在的commit 进行再次提交.
4、bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。git stash pop,恢复的同时把stash内容也删了,还可以用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除。
(1) stash当前修改
git stash //会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工作目录就干净了。
实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令。示例如下:
$ git stash save "test-cmd-stash"
Saved working directory and index state On autoswitch: test-cmd-stash
HEAD 现在位于 296e8d4 remove unnecessary postion reset in onResume function
$ git stash list
stash@{0}: On autoswitch: test-cmd-stash
(2)重新应用缓存的stash
git stash pop //恢复之前缓存的工作目录,这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。
git stash apply //将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝。
(3)查看现有stash
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash show -p stash@{0} //可以查看stash内容
(4)移除stash
可以使用git stash drop命令,后面可以跟着stash名字。下面是一个示例:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
git stash clear //删除所有缓存的stash
5、远程分支
git fetch
git fetch origin master:tmp //在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git diff tmp //来比较本地代码与刚刚从远程下载下来的代码的区别
git merge tmp //合并temp分支到本地的master分支
git branch -d temp //如果不想保留temp分支 可以用这步删除
(1)如果直接使用git fetch,则步骤如下:
创建并更新本 地远程分支。即创建并更新origin/xxx 分支,拉取代码到origin/xxx分支上。
在FETCH_HEAD中设定当前分支-origin/当前分支对应,如直接到时候git merge就可以将origin/abc合并到abc分支上。
(2)git fetch origin
只是手动指定了要fetch的remote。在不指定分支时通常默认为master
(3)git fetch origin dev
指定远程remote和FETCH_HEAD,并且只拉取该分支的提交。
git pull
基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。所以可以认为git pull是git fetch和git merge两个步骤的结合。
git pull <远程主机名> <远程分支名>:<本地分支名>
//取回远程主机某个分支的更新,再与本地的指定分支合并。
6、Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
7、多人协作
git remote -v //查看远程库信息
git push origin master //git push origin 推送分支
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
多人协作
a:
git clone https://github.com/koffuxu/Embedded_Android_in_Chinese.git
git push -u origin master
协作者b
1、把fork过来的项目clone到本地
git clone https://github.com/xugangfeng/Embedded_Android_in_Chinese.git
2、新建并切换到工作(dev)分支
git brach dev
git checkout dev
3、把a的项目添加b的远程仓库
git remote add upstream https://github.com/a/Embedded_Android_in_Chinese
4、把koffuxu的分支拿下来/
git remote update
5、把a的maser分支更新到本地
6、合并a的分支到本地(其实第一次可以不需要)
git rebase upstream/master
b实现了一个功能,现在他要开始提交这个commit了。
git add test.md
git commit -m "modify from xugangfeng"
git push -u origin dev
这时候,xugangfeng进入github网页,进入compare & pull request,填写一些信息,crete pull request即可