Git是一个分布式的版本管理工具,虽然在工作中并没有用到它,但是自己还是忍不住去了解它,去学会使用它。这是我作为一个新手的入门学习笔记
安装Git
Linux上安装Git
- 试着输入git,看看系统有没有安装Git,若没有会提示你如何安装(没有实践)
在Mac OS X上安装Git
- 第一种是安装homebrew,然后通过homebrew安装Git,具体方法可以参考homebrew的文档。
- 第二种是直接从App Story安装Xcode,Xcode集成了Git,你需要运行Xcode,选择菜单"Xcode"->"Preferences",在弹出窗口找到"Downloads",选择"Command Line Tools",点"Install"就可以完成安装了。
在Windows上安装Git
- 从Git官网直接下载安装程序,然后按默认选项安装即可
- 安装完成后,在开始菜单里找到"Git"->"Git Bash",打开一个类似命令行的窗口说明Git安装成功了
安装完成后还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
复制代码
Git使用
linux命令:
创建一个目录:$ mkdir directoryName
进入目录:$ cd directoryName
查看当前所在路径:$ pwd
查看目录(包括隐藏):$ ls -ah
查看文件:$ cat file.txt
删除文件:$ rm file.txt
创建版本库$ git init
:将当前目录变成Git可以管理的仓库
添加文件到版本库$ git add fileName.txt
:git add
命令告诉Git,将文件添加到仓库
提交文件到仓库$ git commit -m "description"
:git commit
命令告诉Git,把文件提交到仓库,-m后面输入的是本次提交的说明,可以输入任意内容,commit可以一次提交很多文件,所以你可以多次add不同的文件
查看仓库当前的状态$ git status
:修改文件后, git status
命令可以让我们时刻掌握仓库当前的状态
查看文件的变化$ git diff
:git diff
就是查看difference,显示的格式正是Unix通用的diff格式$ git diff HEAD -- fileName.txt
:查看工作区和版本库里面最新版本的区别
查看历史记录$ git log
:查看历史记录;--pretty=oneline
参数减少输出信息,HEAD表示当前版本
版本回退$ git reset --hard HEAD^
·:当前版本回退到上一个版本$ git reset --hard commit_id
:指定回到未来的某个版本(版本号没必要写全,前几位就可以了,Git会自动去找 Git提供了一个命令git reflog
用来记录你的每一次命令 )
工作区和暂存区介绍
工作区(Working Directory):就是你在电脑里能看到的目录;工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库(Repository。 Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支
丢弃更改$ git checkout -- file
:可以丢弃工作区的修改,让这个文件回到最近一次git commit
或git add
时的状态$ git reset HEAD file
:可以把暂存区的修改撤销掉(unstage),重新放回工作区,当我们用HEAD时,表示最新的版本
删除文件$ git rm fileName.txt
+git commit
:会从版本库中删除该文件
和远程仓库通过SSH传输
- 创建SSH Key
- 查看用户主目录下,是否有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。
- 如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:$ ssh-keygen -t rsa -C "youremail@example.com",需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可(id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,id_rsa.pub是公钥)
- 绑定SSH Keys
- 登陆GitHub,打开“Account settings>SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
- 添加远程库
- 登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库
- 这个learngit仓库还是空的,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库
- 根据GitHub的提示,在本地的learngit仓库下运行命令:
$ git remote add origin git@github.com:michaelliao/learngit.git
添加后,远程库的名字就是origin - 把本地库的所有内容推送到远程库上:
$ git push -u origin master
(把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 - 之后本地提交,通过命令:
$ git push origin master
- 根据GitHub的提示,在本地的learngit仓库下运行命令:
克隆远程库$ git clone git@github.com:test/gitskills.git
:克隆一个本地库
GitHub还给出了其它地址;Git支持多种协议,默认的git://使用SSH);从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
$ git remote
:查看远程库的信息$ git remote -v
:显示更详细的信息,显示了可以抓取和推送的origin的地址$ git remote rm origin
:删除已有的GitHub远程库
创建与合并分支$ git checkout -b branchName
:创建并切换分支,相当于以下两条命令:$ git branch dev
、$ git checkout dev
$ git branch
:查看当前分支,列出所有分支,当前分支前面会标一个*号$ git merge branchName
:合并指定分支到当前分支$ git branch -d branchName
:删除指定分支 $ git log --graph --pretty=oneline --abbrev-commit
:查看分支的合并情况
通常合并分支时,Git会用Fast forward模式,这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息;--no-ff参数,表示禁用Fast forward:$ git merge --no-ff -m "merge with no-ff" branchName
工作现场$ git stash
:把当前工作现场“储藏”起来,等以后恢复现场后继续工作$ git stash list
:查看工作现场$ git stash apply
:恢复工作现场,恢复后,stash内容并不删除,需要用git stash drop来删除$ git stash pop
:恢复的同时把stash内容也删了$ git stash apply stash@{0}
:用git stash list查看,然后恢复指定的stash
推送分支$ git push origin master
:把该分支上的所有本地提交推送到远程库。推送时,指定本地分支,Git会把该分支推送到远程库对应的远程分支上$ git branch --set-upstream dev origin/dev
:指定本地dev分支与远程origin/dev分支的链接
多人协作的工作模式:
- 首先,可以试图用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。
创建标签$ git tag <name>
:可以打一个新标签,默认标签是打在最新提交的commit上的,需要切换到需要打标签的分支上(创建带有说明的标签:用-a指定标签名,-m指定说明文字;还可以通过-s用私钥签名一个标签) $ git tag
:查看所有标签$ git tag vcommitId
:在指定commit上打标签$ git show <tagname>
:查看标签信息$ git tag -d vcommitId
:删除标签$ git push origin <tagname>
:推送某个标签到远程$ git push origin --tags
:一次性推送全部尚未推送到远程的本地标签$ git push origin :refs/tags/vcommitId
:删除远程标签,得先从本地删除
忽略特殊文件
- Git工作区的根目录下创建一个特殊的.gitignore文件(浏览:github.com/github/giti…提供了各种配置文件)
- 把要忽略的文件名填进去,Git就会自动忽略这些文件
- 把.gitignore也提交到Git
添加被.gitignore忽略文件$ git add -f App.class
:可以用-f强制添加到Git $ git check-ignore -v App.class
:检查是否被忽略
配置别名$ git config --global alias.st status
:告诉Git,以后st就表示statusgit config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
:一个打印日志的别名
搭建Git服务器
- 安装git:
$ sudo apt-get install git
- 创建一个git用户,用来运行git服务:
$ sudo adduser git
- 创建证书登录:收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
- 初始化Git仓库:先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$ sudo git init --bare sample.git;
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:$ sudo chown -R git:git sample.git
- 禁用shell登录:出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
,这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。 - 克隆远程仓库:通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Git使用补充
git checkout .
:本地所有修改的,没有的提交的,都返回到原来的状态
git批量删除文件和批量提交
- 批量删除
- 方法一:(如果是删除当前文件夹下所有文件,方法一将删除该空文件夹一并删除,不会保留文件夹)操作:(cd到你要删除的目录下或者 * 可用“”文件夹名“”代替) -r 代表 recursively(递归)
$ git rm * -r
,$ git commit -m "clear"
- 方法二:手动在文件管理器中删除批量文件,然后执行命令:(如果是删除当前文件夹下所有文件,方法二仍会保留该空文件夹)
$ git add .
,$ git commit -m "clear"
,最后同步到远程仓库,执行:$ git push
- 方法一:(如果是删除当前文件夹下所有文件,方法一将删除该空文件夹一并删除,不会保留文件夹)操作:(cd到你要删除的目录下或者 * 可用“”文件夹名“”代替) -r 代表 recursively(递归)
- 批量提交(命令有版本的区别,查看当前版本:
$ git --version
)git add -A
git add .
git add -r
git add -ignore-removal .
- 解决git clone指令时太慢或者失败
- 利用shadowsocks,设置socks5代理:
git config --global http.proxy 'socks5://127.0.0.1:1080'
;git config --global https.proxy 'socks5://127.0.0.1:1080'
- 只拉取最近的一个revision:
git clone --depth=1 https://github.com/author/test.git
;查看历史版本:git fetch --unshallow
- 利用shadowsocks,设置socks5代理:
- pull 和 fetch
- git pull:从远程拉取最新版本到本地,自动合并(git gull origin master)
- git fetch:从远程获取最新版本到本地,不会自动合并(git fetch origin master)
- 使用git fetch更加安全,可以在merge之前看清楚再合并:git log -p(修改详情) master origin/master;git log origin/master --oneline;git merge origin/master