git 学习笔记

#笔记   #git   #cmd  

作者 Tenie
2017-07-31 00:00:00 字数: 4654 阅读: 146 评论: 0

GUI客户端的,推荐TortoiseGit,类似于TortoiseSVN,基本操作类似,容易上手。https://code.google.com/p/tortoisegit/

 

    git 命令

 git  init //在当前文件夹初始化一个仓库

 git config --global user.name "XXXXX"    //git 配置,这2个是必须的

 git config --global user.email XXX@XXXX.com

/**乱码问题

git config --global core.quotepath false   //对该属性设置为false后, git status 输出的文件路径能正常显示了

*/

git  remote add origin git@github.com:myname/package.git  //和远程仓库关联

git pull origin master  //把远程仓库的东西载入到本地仓库 ,此时远程仓库的东西都下载到本地了

git add filename&dir  // 将文件加入到缓存区

git commit -m "注释"  //将缓存区的内容加入到本地仓库 

git diff *filename //工作区文件和仓库文件做对比

git status    //查看状态

git ls-files  //查看仓库中的所有文件

//版本回退

git log 

git log --pretty=oneline // 查看提交的log ;根据提交的唯一id 回退

git reset --hard  提交id  //根据id来回退 

git reset --hard HEAD^   //使用指针来回退, 只能向前, 一个^ 表示回到上一个版本

git relog //记录的每次的命令日志

git diff HEAD -- filename //查看工作区和版本库里最新版本库的区别

git checkout -- filename //丢弃工作区的文件

git reset HEAD filename  //缓存区有内容了,要丢弃使用后缓存区清空,工作区要丢弃修改就用上面的命令

git rm ** //删除文件 ,删除也要 commit ! 工作区误删用 git checkout -- filename 从库中找回

git rm -f **  //强行删除文件

git remote add origin git@github.com:michaelliao/learngit.git //于远程仓库关联, 此时的远程仓库未初始化!

git push -u origin master //本地仓库推送到远程

 git clone git@github.com:michaelliao/gitskills.git  //从服务器克隆一个git库; clone时本地是没有git库的(没有init)

 

//分支

git checkout -b branchName //创建分支并切换到分支 ,等价于下面2句

git branch branchName

git checkout branchName

git branch //查看当前库中所有分支

git  merge branchName //在master 上调用, 来合并分支

git branch -d branchName  //删除分支; 在分支未被合并过,要删除参数是-D (强制删除)

//合并冲突

//使用 merge 后报冲突的话, 打开冲突文件 ,在冲突的行上有

<<<<<<< HEAD //以下代表master 的内容部分

Creating a new branch is quick & simple.

======= //以下代码分支 的内容部分 

Creating a new branch is quick AND simple.

>>>>>>> feature1

//将  <<<<<<< HEAD ======= >>>>>>> feature1 这些散掉,冲突语句修好 ,在提交就算解决冲突了

git log --graph --pretty=oneline --abbrev-commit //可以看到合并的log

//使用--no-ff参数可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

git merge --no-ff -m "merge with no-ff" dev  

//如何当前分支上的作业未提交, 又要切到主支,来开另一个分支时;

git stash //将当前分支上修改的内容储藏起来, 但这个修改的文件必须是已经在版本库中的文件, (新加的文件不会给你删除掉)

//等在其他分支上操作完,会到当前分支时

git stash pop //将前面储藏的修改内容还原;如下2步操作等价当前这一个命令

git stash apply stash@{0}

git stash drop stash@{0}

git stash list //可以查看储存区

//多人协作

git remote   //查看远程仓库

git remote -v //查看远程仓库详细信息

本地的有多少分支都能退到远程

git push origin dev  //将另一个分支推送到远程仓库

/*

* 但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

* master分支是主分支,因此要时刻与远程同步;

* dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

* bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

* feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

*/

//从远程仓库 clone下来的是master分支 ,要获取远程仓库的分支语法如下:

git checkout -b dev origin/dev    //此时在本地创建一个和远程分支关联的本地分支

git pull //从远处获取更新

//如果在本地分支上 调用git pull失败可能是 本地的分支和远程的分支没有关联

git branch --set-upstream dev origin/dev  //把本地的分支和远程分支关联,在调用git pull会把远程库中的数据下载下来

/*       

* 要是获取远程分支 时报冲突时,需要手动解决, 

*     和前面讲的解决方式一样 ,解决分支后 commit 后再次push 跟新远程库

小结 

查看远程库信息,使用git remote -v; 

本地新建的分支如果不推送到远程,对其他人就是不可见的; 

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; 

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致; 

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name; 

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。 

*/

//给某一个版本打标签, 其实利用的是commit id 命令总结如下

//创建版本标签

git tag <name>   //用于新建一个标签,默认为HEAD,也可以指定一个commit id 

git tag -a <tagname> -m "blablabla..."  //可以指定标签信息; 

git tag -s <tagname> -m "blablabla..."  //可以用PGP签名标签,使用签名必须安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错: 

git tag //可以查看所有标签。

//操作版本标签

git push origin <tagname>  //把本地标签推送到远程仓库

git push origin --tags     //把本地库中的所有标签推送到远程

git tag  -d <tagname>      //删除一个本地标签

git push origin :refs/tags/<tagname>   //删除一个远程仓库中的标签

//github 相关

本机要连github要创建一个秘钥

$ ssh-keygen -t rsa -C "youremail@example.com"

用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面: 然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

git小技巧

   1. git 命令自动提示

为了得到这个脚本,在Unix系统下运行以下命令:

cd ~  

curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash 

然后,添加下面几行到你的 ~/.bash_profile 文件中:

if [ -f ~/.git-completion.bash ]; then  

    . ~/.git-completion.bash  

fi 

   2. 查看文件的提交记录

git blame [file_name]

   3. 查看 提交记录

git reflog

   4. 压缩多个Commit 

如对一个文件的修改进行了多次commit,可使用下面命令来压缩为一个commit

git rebase -i HEAD~2  //压缩2个, 此时会出现一个vi界面, 只要把不需要的pick 删除, 一般只保留最后一个pick

git rebase --abort //如果操作时失败, 可以中断压缩,

   5. Cherry Pick

Cherry-pick就是从不同的分支中检出一个单独的commit,并把它和你当前的分支合并,

场景:如果以并行方式在处理2个或以上分支,可能发现了一个全部分支中都有的bug, 在一个分支中解决了它, 此时就可以使用cherry-pick命令

把它commit到其他分支上去,而不会弄乱其他的文件或commit.

 

6. 找回丢失的commit

git fsck --lost-found //或显示丢失的commit 哈希值列表, 可使用git show 哈希值 来查看对应commit信息

能够找回:分支的提交(已删除的分支)

git stash save "XXX"  //暂存 区里的保存提交,(但stash 被clear过了)

还有git reset --hard HEAD^ //回退到旧的commit 上后, 可以用该方法找到旧commit之前的commit

恢复是使用git merge 2e43c**** 来和当前分支合并那个丢失的提交

 

7. Stash 未提交的更改(复习下stash)

git stash //把当前分支上修改的东西都保存到暂存区;回到分支上次提交的地方或刚开始的地方

git stash save "暂存注释信息" //上面效果一样 但加了注释

 

git stash list //查看暂存区

git stash apply // 取出暂存的内容,到工作区.

git stash apply stash@{2} //恢复某个暂存点

 

 

报错处理: 

error: The following untracked working tree files would be overwritten by merge:

//某个文件

Please move or remove them before you can merge.

解决方法: 

Git clean -d -fx "vendor/huaqin/resource/3rdPart/aw700_default/system/thirdPart.mk"

其中

x -----删除忽略文件已经对git来说不识别的文件

d -----删除未被添加到git的路径中的文件

f -----强制运行