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 -----强制运行