Git核心用法

来源:互联网 发布:admin.seo.com.cn 编辑:程序博客网 时间:2024/06/08 18:25

git是分布式版本控制系统,想要用好github,就应该掌握好git的用法。git学了我差不多一个星期了。。

这篇文章是阅读廖雪峰的Git教程,写下来的个人笔记。这个教程真的很棒,建议大家去看。这里是地址
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

另外,因为是个人笔记,你可能有些看不太懂,所以还是去建议去看廖雪峰大佬的教程。

疑惑

  • http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000
    这里的git reset HEAD file的正确功能是什么,评论区没看懂。我现在认为是将之前add到暂存区的操作撤销掉。

…前面的笔记写在其他地方了。git add < file>; git commit -m “status” ; git log ; git status

撤销修改

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。

  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

  • git rm < file>:发现工作区的文件被删除后,可以用这个把版本库的文件也删了

  • git checkout – < file>: 其实你想要回这个文件,可以用这个方法把版本库里的文件复制回工作区

远程仓库

github

  • 本地git与github仓库之间是用SSH加密的。
  • Window系统打开Git Bash输入$ ssh-keygen -t rsa -C “youremail@example.com”,一路回车,用户主目录就会产生.ssh目录,文件夹下面还有id_rsa和id_rsa.pub。后者是公匙,可以告诉别人。然后在github上的“SSH Key”添加后者里面的内容

添加远程库

  • git remote add origin git@github.com:F-star/learngit.git 关联到远程库
  • origin是远程库的名字,当然你也可以改名字
  • F-star是指在github里的用户名
  • learngit.git是该用户哦创建的git仓库?
  • git push -u origin master:把当前分支推送到github
  • -u参数除了把本地master推送奥远程master,还把master关联起来,以后推送就可以简化命令

从远程库克隆

  • git clone git@github.com:F-star/gitskills.git
  • 这个命令可以把用户F-star的gitsills.git下载到当前位置。当然后面可以用https网址,不过可能有些弊端。

分支管理

创建与合并分支

  • git checkout -b dev -b 表示创建并切换。dev是新的分支名
  • 其实上面这个命令是git branch dev 和 git checkout dev的结合
  • git branch 列出所有分支,并且当前分支前会有一个*
  • git merge dev:git merge命令用于合并指定分支到当前分支。这里指把dev分支合并到当前的分支
  • git branch -d dev 删除dev分支

解决冲突

  • 如果分支修改的文件造成和原分支的文件不同,merge可能会产生冲突,需要手动解决。当然,git status也可以告诉我们冲突的文件是哪个。用git diff可以查看他们的区别,然后修改成两个文件内容一样。之后再add和commit
  • git log –grap 查看分支图

分支管理策略

  • 合并分支时,git会用Fast forward模式,这种模式下,删除分支后,分支信息会被丢掉。
  • git merge –no-ff -m “merge with no-ff” dev (–on-ff指的是禁用fast forward,-m “context”指的是提交一个commit,这样git会在merge产生一个新的commit,这样你就知道这里其实被合并过。

BUG分支

  • git stash 当你接到一个重要的bug任务时,此时你在分支C的工作只进行到一半,没法提交。可以用这个命令将当前工作现场“储存”起来。
  • 做完上面这些,你就可以跳到要修复bug的分支A上,在这个分支上建一个临时分支B,修改完后add和commit,然后切回分支A上,合并分支B,最后用git branch -d删除掉这个临时分支B。
  • bug修完了哦。回到分支C,用status发现工作区是干净的。然后你用git stash list查看stash的具体情况。恢复工作区的方法有两个:(1)git stash apply:恢复后,stash内容不删除,要用git stash drop来删除(2)git stash pop:恢复的同时stash内容也删了。
  • git stash apply stash@{0} 可以多次stash然后恢复的时候可以指定特定的stash

Feature分支

开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
- 教程大概意思是没有进行合并的分支用git branch -d是删不掉的,要用git branch -D

多人协作

  • git remote 查看远程库信息
  • git remote -v 显示更详细信息,显示抓取和推送的origin地址。没有权限的话就看不到push地址
  • git push origin master 将master分支推送到远程库上,master可以改成其他分支,推送其他分支
  • 有些分支需要推送到远程,如master,还有dev(开发分支)。bug分支就没必要了,feature(新功能)取决于是否和同事有合作
  • 抓取分支你的小伙伴视角
  • git clone git@github.com:F-star/solar_terms.git 将远程的某个git克隆。默认情况下,只能看到master分支。
  • 如果要在dev下开发。需要git checkout -b dev origin/dev 创建远程origin的dev分支到本地。不时地commit和push就好
  • 有时推送失败是因为有人也推送了,git会要求你先pull。这时候git pull就好了。
  • 有时git pull失败了。原因是没有指定本地dev分支和远程origin/dev分支的链接。你要这样:git branch –set-upstream dev origin/dev
  • git pull成功了,有时合并有冲突,需手动解决,参照==解决冲突==章节。搞定后push就好

标签管理

  • git的标签指定某个commit的指针,是版本库的一个快照,可以通过tag快速地找到某个commit。相比commit号,tag更能见名知义。

创建标签

  • git tag < name> 切换到需要打标签的分支上,执行这个命令,标签会默认打到最新的commit上。不需要双引号
  • git tag < name> < commitID> 把标签打到指定的commit上
  • git log –pretty=oneline –abbrev-commit 查看简化版的commit(其实没看懂)
  • git tag 查看标签(按字母排序)
  • git show 查看具体标签信息
  • git tag -a v0.1 -m “version 0.1 released” 3628164 创建带有说明的表情,-a指定标签名,-m指定说明文字
  • git tag -s v0.2 -m “signed version 0.2 released” fec145a 可以通过-s用私钥签名一个标签,签名采用PGP签名,需下载gpg(GunPG)。具体先不去了解,我也不知道下那个版本的gunpg好。。
  • 另外,一个commit可以有多个tag

操作标签

  • git tag -d < tagname> -d删除指定标签
  • git push origin < tagname> 推送标签到远程
  • git push origin –tags 推送全部尚未推送的标签到远程
  • 如果要删除远程标签,稍微比较麻烦。步骤如下(1)删除本地标签git tag -d (2)git push origin ==:refs/tags/==< tagname> 这样就把远端的标签删除了,注意格式

使用GitHub

  • 在你想要参与的项目点击“fork”,即可在自己的账号下克隆一个该项目。
  • git clone 克隆自己账号下的那个项目到本地。另外,如果直接从作者的仓库clone,这个git是不能推送和修改的哦
  • 可以pull request来给官方仓库贡献代码

自定义Git

  • git config 可以修改git的可配置项
  • 如 git config –global color.ui true git会适当显示不同颜色

忽略特殊文件

  • 有些文件必须放到git工作目录下,但不能提交它们(比如保存了数据库密码的配置文件)。这样每次status都会显示Untracked files ,让人很不爽。
  • 在git工作目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,git就会忽略这些文件。
  • github为我们准备了各种配置文件,组合一下即可。网址:https://github.com/github/gitignore
    忽略文件的原则是:

    1. 忽略操作系统自动生成的文件,比如缩略图等;
    2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
  • 在.gitignore文件内写好要忽略的文件名字后,将.gitignore文件提交,就搞定了
  • 有时候,你发现有些文件不能add,是因为这个文件被.gitignore忽略了。
  • 你可以git add -f < file> 强制add
  • 也可能是.gitignore没写好,可以git check-ignore 来检查。git check-ignore -v 可知道.gitignore文件哪行有问题。

配置别名

  • http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375234012342f90be1fc4d81446c967bbdc19e7c03d3000
  • 偷懒技巧
  • git config –global alias.st status
  • 上面表示用st来代替status
  • git log -2 显示最新两个commit
  • 配置git时,–global是针对当前用户起作用,否者指对当前仓库起作用。
  • 当前仓库:配置文件都在.git/config。在[alias]后面,想删除可以在这里删除掉。不小心把文件搞黄了,也可以删掉文件通过命令配置(怎么配置?cmd会有提示?)
  • 当前用户:配置文件在用户主目录的一个隐藏文件.gitconfig中。

搭建Git服务器

  • 准备一台运行Linux的机器,推荐Ununtu或Debian(貌似他俩是系统)
  • 假设有sudo权限的用户账号。
  • 1.安装git:sudo apt-get install git
  • 2.创建git用户来运行git服务:sudo adduser git
  • 3.创建证书登录:收集所有需要登录的用户的公钥,即他们的id_rsa.pub文件,将公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
  • 4.初始化Git仓库:先选定一个目录作为Git仓库。假定是/srv/sample.git,在/srv目录下输入 sudo git init –bare sample.git 这样就获得一个裸仓库,它没有工作区,因为它只用来共享。另外根据习惯,服务器的Git仓库都是.git结尾。然后把owner改为git:==$ sudo chown -R git:git sample.git==(没看懂)
  • 5.禁用shell登录:出于安全考虑,禁用shell。通过编辑/etc/passwd文件完成。找到类似下面的一行:

    git:x:1001:1001:,,,:/home/git:/bin/bash

    改为
    git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell


这样,为git用户指定的git-shell每次一登录就自动退出。
  • 6.克隆远程仓库:git clone git@server:/srv/sample.git 克隆远程仓库,推送就很简单了。
  • 另外,团队小的话,放到服务器的/home/git/.ssh/authorized_keys文件里就行。团队有几百号人就可以用用Gitosis(貌似还能控制权限,不同人员的读写权限精确到某分支上火其他)来管理公钥。
0 0