Git学习笔记

Git学习笔记

1.Git安装

1.1 Linux上安装Git

$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

1.2 源码安装

下载 https://github.com/git/git
./config
make
sudo make install

1.3 Windows上安装Git

下载:Git

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

说明:--global表示你这台机器上所有的Git仓库都会使用这个配置

2.创建版本库

2.1 创建文件夹

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

2.2 初始化Git

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

说明:自动创建.git的目录,这个目录是Git来跟踪管理版本库的。版本控制系统可以告诉文本的改动,单二进制文件只能跟踪文件大小的变化。

2.3 添加文件

git add readme.txt                    //把文件提交到仓库,实际相当于把修改放入暂存区
git commit -m "wrote a readme file"    //本次提交的说明

3.时光机穿梭

3.1 查看仓库状态

git status

3.2 查看文件修改内容

git diff

3.3 查看历史修改记录

git log

说明:加上--pretty=oneline参数,简化显示。Git用HEAD表示当前版本,上一个版本位HEAD^,上上个为HEAD^^,往上第100个版本为HEAD~100

3.4 版本回退

git reset --hard HEAD^

指定回退版本

git reset --hard 3628164                //版本号没必要写全,Git会自动寻找

3.5 查看历史命令

git reflog

3.6 丢弃工作区修改

git checkout -- file                    //让file文件回到最近一次git commit或git add的状态

3.7 丢弃暂存区修改

git reset HEAD file                     //file文件暂存区修改撤销掉,重新放回工作区

3.8 Git删除文件

第一种,确实需要删除

git rm file                 //删除
git commit                  //提交

第二种,删错

git checkout -- file        //用版本库里版本替换工作区版本

4.远程仓库

4.1 添加远程库

由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密,所以需要设置以下步骤

1.创建SSH Key (查看主目录有没有.ssh目录,有则查看有没有id_rsaid_rsa.pub这两个文件,有则跳过)

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

说明:id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥

2.登陆Github,打开“Account settings”,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key。

4.2 从远程库克隆

git clone git@github.com:michaelliao/gitskills.git

5.分支管理

5.1 创建分支

git checkout -b dev             //-b表示切换

5.2 查看分支

git branch

说明:当前分支前面会标一个*号。

5.3 切换分支

git checkout master

5.4 合并分支

git merge dev

说明:该命令用于合并指定分支到当前分支。“快进模式”,也就是直接把master指向dev的当前提交

5.5 删除分支

git branch -d dev

5.6 分支冲突

git status也可以告诉我们冲突的文件,Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,git log也可以看到分支的合并情况。当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。用git log --graph命令可以看到分支合并图。

5.7 分支管理策略

​ 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

git merge --no-ff -m "merge with no-ff" dev     //历史显示合并记录

5.8 Bug分支(存储现场)

说明:Git提供stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。

1.首先确定在哪个分支上修复bug,在其分支上创建临时分支

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
$ git checkout -b issue-101
Switched to a new branch 'issue-101'

2.修复完成,提交

3.切换到主分支,合并分支,最后删除issue-101分支

4.切换回dev分支

5.恢复工作内容

git stash list              //查看stash区内容
git stash apply             //恢复stash区内容,不丢弃
git stash drop              //丢弃stash区内容
git stash pop               //恢复stash区内容,并丢弃

5.9 Feature分支(强制删除没有被合并的分支)

git branch -D feature-vulcan

5.10 多人协作

​ 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin

5.10.1 查看远程仓库信息:

$ git remote
origin

5.10.2 显示更详细信息

$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)

5.10.3 推送分支

git push origin master          //指定本地分支

5.10.4 抓取分支

git checkout -b dev origin/dev

5.10.5 合并冲突分支

​ Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。

$ git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From github.com:michaelliao/learngit
   fc38031..291bea8  dev        -> origin/dev
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream dev origin/<branch>

指定本地分支与远程分支链接

git branch --set-upstream dev origin/dev

6.标签管理

6.1 创建标签

首先切换到需要打标签的分支上:

$ git branch
* dev
  master
$ git checkout master
Switched to branch 'master'

然后敲命令git tag <name>就可以打一个新标签:

$ git tag v1.0

6.2 查看所有标签:

$ git tag
v1.0

6.3 指定commit id 标签

方法是找到历史提交的commit id,然后打上就可以了:

$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt
...

比方说要对add merge这次提交打标签,它对应的commit id是6224937,敲入命令:

$ git tag v0.9 6224937

说明:标签不是按时间顺序列出,而是按字母排序的。

6.4 查看标签信息

$ git show v0.9
commit 622493706ab447b6bb37e4e2a2f276a20fed2ab4
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Thu Aug 22 11:22:08 2013 +0800

    add merge
...

可以看到,v0.9确实打在add merge这次提交上。

6.5 创建带有说明的标签

说明:用-a指定标签名,-m指定说明文字:

$ git tag -a v0.1 -m "version 0.1 released" 3628164

6.6 删除标签

$ git tag -d v0.1
Deleted tag 'v0.1' (was e078af9)

6.7 推送标签到远程

推送单个:

$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
 * [new tag]         v1.0 -> v1.0

推送全部:

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 554 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
 * [new tag]         v0.2 -> v0.2
 * [new tag]         v0.9 -> v0.9

6.8 删除远程标签

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d v0.9
Deleted tag 'v0.9' (was 6224937)

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/v0.9
To git@github.com:michaelliao/learngit.git
 - [deleted]         v0.9

7.码云使用

​ 国内的Git托管服务——码云gitee.com)。和GitHub相比,码云也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。

​ 在码云上注册账号并登录后,需要先上传自己的SSH公钥。选择右上角用户头像 -> 菜单“修改资料”,然后择“SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的.ssh/id_rsa.pub文件的内容粘贴进去,点击“确定”即可完成并看到刚才添加的Key:

​ 如果我们已经有了一个本地的git仓库(例如,一个名为learngit的本地库),如何把它关联到码云的远程库上呢?首先,我们在码云上创建一个新的项目,选择右上角用户头像 -> 菜单“控制面板”,然后点击“创建项目”。项目名称最好与本地库保持一致。

然后,我们在本地库上使用命令git remote add把它和码云的远程库关联:

git remote add origin git@gitee.com:liaoxuefeng/learngit.git

之后,就可以正常地用git pushgit pull推送了!

如果在使用命令git remote add时报错:

git remote add origin git@gitee.com:liaoxuefeng/learngit.git
fatal: remote origin already exists.

这说明本地库已经关联了一个名叫origin的远程库,此时,可以先用git remote -v查看远程库信息:

git remote -v
origin    git@github.com:michaelliao/learngit.git (fetch)
origin    git@github.com:michaelliao/learngit.git (push)

可以看到,本地库已经关联了origin的远程库,并且,该远程库指向GitHub。

我们可以删除已有的GitHub远程库:

git remote rm origin

再关联码云的远程库(注意路径中需要填写正确的用户名):

git remote add origin git@gitee.com:liaoxuefeng/learngit.git

此时,我们再查看远程库信息:

git remote -v
origin    git@gitee.com:liaoxuefeng/learngit.git (fetch)
origin    git@gitee.com:liaoxuefeng/learngit.git (push)

现在可以看到,origin已经被关联到码云的远程库了。通过git push命令就可以把本地库推送到Gitee上。

​ 因为git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。

仍然以learngit本地库为例,我们先删除已关联的名为origin的远程库:

git remote rm origin

然后,先关联GitHub的远程库:

git remote add github git@github.com:michaelliao/learngit.git

注意,远程库的名称叫github,不叫origin了。

接着,再关联码云的远程库:

git remote add gitee git@gitee.com:liaoxuefeng/learngit.git

同样注意,远程库的名称叫gitee,不叫origin

现在,我们用git remote -v查看远程库信息,可以看到两个远程库:

git remote -v
gitee    git@gitee.com:liaoxuefeng/learngit.git (fetch)
gitee    git@gitee.com:liaoxuefeng/learngit.git (push)
github    git@github.com:michaelliao/learngit.git (fetch)
github    git@github.com:michaelliao/learngit.git (push)

如果要推送到GitHub,使用命令:

git push github master

如果要推送到码云,使用命令:

git push gitee master

8.自定义Git

8.1 显示颜色

git config --global color.ui true

8.2 忽略特殊文件

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

举个例子:

假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini文件,因此你需要忽略Windows自动生成的垃圾文件:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

然后,继续忽略Python编译产生的.pyc.pyodist等文件或目录:

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

加上你自己定义的文件,最终得到一个完整的.gitignore文件,内容如下:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean

使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。

有些时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:

$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.

如果你确实想添加该文件,可以用-f强制添加到Git:

$ git add -f App.class

或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:

$ git check-ignore -v App.class
.gitignore:3:*.class    App.class

Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。

8.3 搭建Git服务器

8.3.1 搭建git远程仓库

1.在Linux上新建一个git用户

sudo adduser git

1

在新建用户的时候,需要创建密码,比如git。

2.切换用户

su git

切换到/home/git目录中,并且创建密钥与公钥

ssh-keygen -t rsa -C “tianci.liu@qq.com”

这里写图片描述

3.创建仓库

其实最好创建仓库时创建一个裸仓库

git init –bare learn.git

注意:这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果你硬要操作的话,只会得到下面的错误(”This operation must be run in a work tree”),所以对于远程仓库,我们初始化的时候最好使用git –bare init命令初始化。

远程仓库只是起到一个中转站的作用,在git服务器上不能直接修改仓库里的文件。

下面这种方式创建的仓库不适合远程管理

这里写图片描述

仓库创建完成后可以看到如下目录

这里写图片描述
4.改变仓库权限

chown -R git:git learn.git

这里写图片描述

这样一个远程仓库就创建完成了。

8.3.2 远程仓库管理

上面创建的远程仓库是无法直接进行git add或者git commit操作的,如果需要操作,那就需要使用仓库的人进行更新或者上传。

在操作远程服务器时。理论上只要在同一网段下的用户都可以进行操作。

8.3.2.1 window上进行操作

1.首先在window上进行操作:

这里写图片描述

输入刚才建立的远程服务器的地址,然后git clone即可使用。

这里写图片描述

密码为刚才创建用户的密码,比如git。

这样代码就能够下载下来了。

8.3.2.2 提交操作

如果想自己提交信息到远程服务器上,可以先commit提交到本地,然后push提交到服务器上

先创建一个readme.txt文件

这里写图片描述

提交推送

这里写图片描述

这里写图片描述

输入密码

这里写图片描述

这样,服务器仓库上会自动更新信息

这里写图片描述

这样就能够实现Windows上访问远程git的功能。

8.3.2.3 Linux上进行操作

首先切换到其他用户,比如tiezheng002

创建一个目录用于clone代码

tiezheng002@ubuntu:~$ mkdir learn
tiezheng002@ubuntu:~$ cd learn/
tiezheng002@ubuntu:~/learn$ ls
tiezheng002@ubuntu:~/learn$ git clone git@192.168.31.91:/home/git/rt_thread.git
Cloning into 'rt_thread'...
The authenticity of host '192.168.31.91 (192.168.31.91)' can't be established.
ECDSA key fingerprint is SHA256:bJBbVb9skY/BKCsJ5Kxv4DOIVGYjYn4majRNYAsO+cU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.31.91' (ECDSA) to the list of known hosts.
git@192.168.31.91's password: 
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Checking connectivity... done.

然后加入两个测试文件,提交后commit

tiezheng002@ubuntu:~/learn/rt_thread$ git add -A
tiezheng002@ubuntu:~/learn/rt_thread$ git commit -m"add file"

最后push到远程上

tiezheng002@ubuntu:~/learn/rt_thread$ git push
warning: push.default is unset; its implicit value has changed in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the traditional behavior, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

When push.default is set to 'matching', git will push local branches
to the remote branches that already exist with the same name.

Since Git 2.0, Git defaults to the more conservative 'simple'
behavior, which only pushes the current branch to the corresponding
remote branch that 'git pull' uses to update the current branch.

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

git@192.168.31.91's password: 
Everything up-to-date

这样就将代码传到服务器上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值