拉取远程git项目的某个分支
- master分支:默认会拉取的分支,直接
git clone URL
就可以获取到。$ git clone https://git.oschina.net/androidJP/Demo.git
- 非master分支:需要
git fetch
和git checkout -b XXX remote仓库/XXX
结合使用。$ git clone https://git.oschina.net/androidJP/Demo.git ///项目的默认分支被克隆下来了 $ git branch /// 输出:如master 等已经拉取到的分支名和当前分支 $ git fetch $ git checkout -b develop origin/develop /// 拉取远程的develop分支并本地切换到了develop分支
本地分支pull不了
原因:你的本地分支没有关联上远程分支.
- 方法一:直接指定要pull哪个远程分支(默认会merge):
$ git pull origin <远程分支名>
- 方法二:绑定某个分支,之后就直接
git pull
即可:$ git branch --set-upstream-to=origin/<远程分支名> <本地分支名>
本地创建一个新分支并推送到远程,让远程也生成新分支
$ git checkout -b branchA
....
$ git add .
$ git commit -m "what you change"
/// 将本地分支推到远程的同名分支上
$ git push origin branchA
版本回滚和还原
- 回滚
- 法一:通过
git log
查看版本号,然后通过版本号来定位HEAD
应该指向哪里。$ git log --pretty=oneline $ git reset --hard 12345
- 法二:通过
HEAD^
等,回滚到上一个/上N个版本// 上个版本 $ git reset --hard HEAD^ //上上个版本 $ git reset --hard HEAD^^ // 前100个版本 $ git reset --hard HEAD~100
- 还原
原理:还是使用reset --hard <版本号>
的方式实现,并通过git reflog
来获取以前的git操作记录,从而得到对应的版本号。
$ git reflog
$ git reset --hard 12345
不小心写了句“老板真欠扁”,怎么办?
- 如果你已经commit了
恭喜你,只能用版本回滚了。(如果老板没有你最新提交版本的版本号的话) - 幸好,我的文件还在工作区,没有被add。
///将我这个文件myFile.txt的所有修改都清空 $ git checkout -- myFile.txt
- 哦哦,我的文件add进了暂存区。
// 第一步,还原 add 这个操作(暂存区 --> 工作区) $ git reset HEAD myFile.txt // 第二步,清空工作区(工作区 --> 未修改) $ git checkout -- myFile.txt
误删文件?不用慌
假如你的上一个版本已经commit 了 a.txt ,然后,现在你手动删除了这个a.txt 文件:
- 如果你真想删文件a.txt
// 直接删掉,并再commit一次 $ git rm a.txt $ git commit -m "confirm delete a.txt"
- 如果发现是误删文件,那就只能还原到上一个版本的a.txt了。(如果你的上一个版本确实commit了这个文件)
$ git checkout -- a.txt
SSH 公约私钥生成
///在你的用户主目录下的 .ssh 文件夹中生成公钥和私钥
$ ssh-keygen -t rsa -C "youremail@example.com"
分支的原理
- 原理:
-
HEAD
永远指向当前分支。 - 默认:
HEAD
指向master
,master
指向最新提交。 - 合并分支,是:站在待合并分支上,将这个分支点的指针,指向要合并到的分支指针位置。
-
-
相关命令:
分支合并与冲突解决
-
本地两个分支的
merge
冲突解决:- 合并
$ git checkout develop $ git merge newBranch1
- 合并后,发现冲突,一般表现形式如下:
.............. <<<<<<< HEAD 分支 develop 上的内容 ======= 分支 newBranch1上的修改内容 >>>>>>> newBranch1
- 自己用编辑器打开文件进行解决。
- 最后
add
和commit
提交,这样,就完成了一个分支的合并。
- 使用
--no-ff
禁止fast forward提交,以保留合并的分支信息,在分支被删除后,也会保留分支的合并记录。- 合并
$ git merge --no-ff -m "merge with no-ff" dev
- (可选)解决冲突
- 查看分支合并信息
$ git log --graph --pretty=oneline --abbrev-commit
远程仓库
- 创建
$ git remote add origin git@github.com:michaelliao/learngit.git
- 推送
/// 第一次推送,-u 作用是将本地仓库与远程仓库origin 绑定 $ git push -u origin master /// 以后的推送,则不需要再次绑定了 $ git push origin master
- 查看远程库信息
$ git remote /// 远程库名 $ git remote -v ///详细信息
- 查看远程分支
$ git branch -a ///查看所有分支(包括本地和远程仓库) $ git branch
- 删除远程分支
$ git branch -r -d origin/develop /// 删除远程分支develop $ git push origin :develop ///删除远程的develop分支
log 妙用
-
git log --pretty=oneline
:单行查看当前分支日志 -
git log --graph --pretty=oneline
:查看当前分支的合并情况 -
git log --graph --pretty=oneline --abbrev-commit
:和命令2效果相似。
dev分支码到一半,发现master分支的版本有bug,要马上改
思路:dev的修改先保存起来,然后切换到master分支,再打bug分支修复bug,修复成功并合并后,最终切回dev分支,并取回之前保存的dev分支的修改内容,继续码。
步骤:
- 暂存dev工作现场
$ git stash
- 切回master, 打bug修复分支,修复并合并
$ git checkout master $ git checkout -b bug-solve-101 ////修复bug中。。。。 $ git checkout master $ git merge --no-ff -m "bug 101修复成功" bug-solve-101
- 最终,切回dev分支,并还原工作现场
$ git stash pop /// 还原现场,并清除存储栈中的内容 /// $ git stash list /// 查看存储栈中的工作现场列表 /// $ git stash apply ///只恢复,不删除栈 /// $ git stash drop /// 删除栈存储区
fetch 和 pull 的区别
-
$ git fetch origin develop
:只是拉取远程的develop分支的最新提交版本,到本地的.git/refs/remotes
目录【远程版本库】中,并没有合并到本地分支,也就是本地分支仍然只有master
,没有develop
.【本地版本库目录:.git/refs/heads
】 -
$ git pull origin develop
:相当于:git fetch origin develop
+git merge develop
; 获取远程develop分支,并将其合并到当前你所在的本地分支。
让本地分支追溯到远程某个分支
如果发现,自己创建的本地分支pull不了,那么,可能是本地分支没有与远程分支建立关联,这时:
git branch --set-upstream-to=origin/<branch> develop
就可以建立连接,之后,就是各种push、pull和merge了!
Pull 不下来怎么办?
- 如果发现是这种报错:
fatal: refusing to merge unrelated histories
【在新建Ionic项目的时候经常这样】,那么,用这条语句来pull:git pull origin master --allow-unrelated-histories
git clone 指定目录
如果我们不想每次先cd到那个目录在进行clone操作,那么,这句命令很有用:
git clone <git url> "C:\a\b"
其中:a
表示指定目录,b
表示你自定义的文件夹名,如:
>git clone https://github.com/androidjp/xxxxx.git "D:\aaa\bbb"
最终,会创建aaa\bbb
目录和文件夹,然后在内部拉取所有代码。
Lag标签
-
git tag <name>
:新建一个标签,默认为HEAD,也可以指定一个commit id; -
git tag -a <tagname> -m "blablabla..."
:可以指定标签信息; -
git tag -s <tagname> -m "blablabla..."
:可以用PGP签名标签; -
git tag
:可以查看所有标签 -
git push origin <tagname>
:可以推送一个本地标签; -
git push origin --tags
:可以推送全部未推送过的本地标签; -
git tag -d <tagname>
:可以删除一个本地标签; -
git push origin :refs/tags/<tagname>
:可以删除一个远程标签。
网友评论