一、Git
1、git的由来
2、安装
- 下载对应操作系统的Git客户端版本
- Linux上安装,yum install git
- Windows 上面安装 git –version 查看版本号
- 3、概念
远程仓库 本地仓库 工作区
Repository仓库、版本号
git 初始化后,会在当前目录生成一个.git目录,这就版本库。
Workspace 工作空间,工作区。
.git 所在的目录就是工作区,一般是项目的根目录。
Index 索引
介于工作区和版本库之间,暂存修改的
Remote远程版本库
网络上的另一个版本库,可以和本地库交互。
4、使用
1)初始化一个版本库
#### git init 初始化。
在目录中增加一个.git目录,不能自行修改这个目录里面的文件,
这个目录一般是根目录。
2)添加文件
利用vim创建文件并增加文件内容。
单个添加文件:git add index.htm
这一步是把文件的当前变化增加到索引中,也就是以后这个文件需要版本库来跟踪管理,不是提交。此时文件还可以继续修改,还可以添加新的被跟踪文件,一定要add才把这个改变加入索引中。
批量增加文件:git add .
.号,代表当前目录,这条命令就地柜添加到当前目录及其子目录的所有文件。
只要是目录,就会递归添加到该目录下的文件和子目录。
3)查看状态: git status
-
4)git文件的分类
追踪的Tracked,已经加入到版本库的文件。
为追踪的UNtracked,未加入到版本库的文件。
忽略的ignored,git不在关注的文件,例如一些临时文件。
.gitignore文件中,目录以/结尾,行起始的!是取反。
.gitignore 内容如下:*.ipynb __pycache__/ .*
忽略的文件不需要自己写,Python的已经有了。
5)提交代码 git commit -m “first commit”
Commit 提交更改到版本库。 -m填写本次日志消息,必须写,工作中,需要注明每一次提交都做了什么修改。
更改文件后再次提交:显示的是modified: index.htm
git commit -m “2 No2 commit”
6)git 的提交
Git的提交,分为两个步骤。
暂存变更:add的作用是把新文件或者新的文件的改动添加到一个暂存区stage,也就是加入到index中。
提交变更:commit提交的是暂存区中的改动,而不是物理文件目前的改动,提交到当前分支,默认是master分支。
两步合为一步:git commint -a -m
改动一批文件,一个个名词很麻烦,使用git commit -a
-a ,–all 会把所有跟踪的文件改为自动暂存,然后commit。
7)增补
增加一个文件,
touch about.htm
git commit –amend
-amend 修改
git log 查看版本库里面提交的历史记录。
8)diff比较
git diff 工作区和暂存区
git diff HEAD 工作区和本地仓库,比较工作区和上一次commit的差异。HEAD指代最后一的commit。
git diff –cached 跟踪文件的暂存修改,比较暂存区和上一次commit的差异。
9)HEAD
HEAD,指代最后一次commit
HEAD可以看做是一个游标,指向当前分支最后一次提交。
HEAD^上一次。
上n次,表示为HEAD~n
10)检出和重置
命令 说明 Git checkout 列出暂存区 Git checkout file 从暂存区检出文件到工作区,就是覆盖工作区文件,可指定检出的文件,但是不清楚stage Git checkout commit file 检出某个commit的指定文件到暂存区和工作区 Git checkout 检出暂存区的所有文件到工作区 Checkout用于切换分支,或恢复工作区文件。
checkout会重写工作区,这个命令还是比较危险的。
[root@localhost ~]# echo >about.htm 清空文件
[root@localhost ~]# git checkout about.htm 从暂存区检出到工作区
[root@localhost ~]# git checkout HEAD about.htm 从最后一次commit检出覆盖暂存区和工作区
[root@localhost ~]# git diff
[root@localhost ~]# git diff –cached
[root@localhost ~]# git diff HEAD
[root@localhost ~]# 三条命令显示结果一致了
命令 说明 Git reset 列出被reset的文件 Git reset file 重置文件的暂存区,和上一次commit一致,工作区不影响 Git reset-hard 重置暂存区与工作区,与上一次commit保持一致 [root@localhost ~]# echo “welcome about<html>” > about.htm 文件更改内容
[root@localhost ~]# git add about.htm 添加到暂存区
[root@localhost ~]# git reset about.htm 使用最后一次提交覆盖暂存区
Unstaged changes after reset:
M about.htm
[root@localhost ~]# cat about.htm 内容不变
welcome about<html>
[root@localhost ~]# git add about.htm
[root@localhost ~]# git reset –hard 重置暂存区与工作区为上一次commit
HEAD is now at 1ed76cf No3 commit
[root@localhost ~]# cat about.htm 工作区内容恢复未改变之前。
welcome about
命令 说明 Git reflog 显示commit信息,只要是HEAD发生变化,就可以看到 Git reset commit 重置当前分支的HEAD为指定commit,同时重置暂存区,但是工作区不变 Git reset -hard [commit] 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit Git reset –keep [commit] 重置当前HEAD为指定commit,但保持暂存区和工作区不变 重置的时候,使用hash值只要能唯一确定一个commit就可以了。
reset操作 要慎重。
11)移动和删除
Git mv src dest 改名,直接把改名的改动放入暂存区。
Git rm file 会同时在版本库和工作目录中删除文件。
Git rm -cached file 将文件从暂存区转成未暂存,从版本库中删除,但不能删除工作目录的该文件,即文件恢复不追踪状态。 都是算是改动,commit才算是真改动。
###创建一个新的文件
[root@localhost ~]# echo “python” > python.htm
[root@localhost ~]# git add python.htm
[root@localhost ~]# git commit -m “add python”
[master 50e12c9] add python
Committer: root <root@localhost.localdomain>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config –global user.name “Your Name”
git config –global user.email you@example.com
If the identity used for this commit is wrong, you can fix it with:
git commit –amend –author=’Your Name <you@example.com>’
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 python.htm
[root@localhost ~]# git log
commit 50e12c9e4dd5928dbaf14b647bccd954293ff5e6
Author: root <root@localhost.localdomain>
Date: Tue May 22 09:21:17 2018 +0800
add python
commit 1ed76cf5c048bfeef64916ffa4d66abdc81fd55f
Author: root <root@localhost.localdomain>
Date: Tue May 22 08:58:00 2018 +0800
No3 commit
commit ab76fd902da7168e69b2ca1152373c9c571e7045
Author: root <root@localhost.localdomain>
Date: Mon May 21 20:11:18 2018 +0800
2 No2 commit
commit 584479710780dc2069751636c1d27f2233abfc4b
Author: root <root@localhost.localdomain>
Date: Mon May 21 20:05:51 2018 +0800
1 No1 commit
###2mv
[root@localhost ~]# git mv python.htm python.py
[root@localhost ~]# git commit -m “my python”
[master 30cd6ee] my python
Committer: root <root@localhost.localdomain>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config –global user.name “Your Name”
git config –global user.email you@example.com
If the identity used for this commit is wrong, you can fix it with:
git commit –amend –author=’Your Name <you@example.com>’
1 files changed, 0 insertions(+), 0 deletions(-)
rename python.htm => python.py (100%)
###3rm
rename python.htm => python.py (100%)
[root@localhost ~]# echo “print(“hello python”)” > python.py
[root@localhost ~]# git add python.py
[root@localhost ~]# git diff -cached
error: invalid option: -cached
[root@localhost ~]# git diff –cached
diff –git a/python.py b/python.py
index fdc793e..a280d44 100644
— a/python.py
+++ b/python.py
@@ -1 +1 @@
-python
+print(hello python)
[root@localhost ~]# git rm –cached python.py
rm ‘python.py’
[root@localhost ~]# git diff –cached
diff –git a/python.py b/python.py
deleted file mode 100644
index fdc793e..0000000
— a/python.py
+++ /dev/null
@@ -1 +0,0 @@
-python
[root@localhost ~]# git commit -m “delete python”
[master 501fec3] delete python
Committer: root <root@localhost.localdomain>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config –global user.name “Your Name”
git config –global user.email you@example.com
If the identity used for this commit is wrong, you can fix it with:
git commit –amend –author=’Your Name <you@example.com>’
1 files changed, 0 insertions(+), 1 deletions(-)
delete mode 100644 python.py
[root@localhost ~]# ls
about.htm
anaconda-ks.cfg
Desktop
Documents
Downloads
git-2.16.3-intel-universal-mavericks.dmg
gogs.script
index.htm
install.log
install.log.syslog
Music
Percona-Server-5.5.45-37.4-r042e02b-el6-x86_64-bundle.tar
Percona-Server-55-debuginfo-5.5.45-rel37.4.el6.x86_64.rpm
Percona-Server-client-55-5.5.45-rel37.4.el6.x86_64.rpm
Percona-Server-devel-55-5.5.45-rel37.4.el6.x86_64.rpm
Percona-Server-server-55-5.5.45-rel37.4.el6.x86_64.rpm
Percona-Server-shared-55-5.5.45-rel37.4.el6.x86_64.rpm
Percona-Server-test-55-5.5.45-rel37.4.el6.x86_64.rpm
Pictures
Public
python.py
Templates
Videos
[root@localhost ~]# git status
# On branch master
# Untracked files:
# (use “git add <file>…” to include in what will be committed)
#
# .ICEauthority
# .Xauthority
# .abrt/
# .bash_history
# .bash_logout
# .bash_profile
# .bashrc
# .cache/
# .config/
# .cshrc
# .dbus/
# .esd_auth
# .gconf/
# .gnome2/
# .gnote/
# .gnupg/
# .gtk-bookmarks
# .imsettings.log
# .local/
# .mysql_history
# .pulse-cookie
# .pulse/
# .tcshrc
# .viminfo
# Percona-Server-5.5.45-37.4-r042e02b-el6-x86_64-bundle.tar
# Percona-Server-55-debuginfo-5.5.45-rel37.4.el6.x86_64.rpm
# Percona-Server-client-55-5.5.45-rel37.4.el6.x86_64.rpm
# Percona-Server-devel-55-5.5.45-rel37.4.el6.x86_64.rpm
# Percona-Server-server-55-5.5.45-rel37.4.el6.x86_64.rpm
# Percona-Server-shared-55-5.5.45-rel37.4.el6.x86_64.rpm
# Percona-Server-test-55-5.5.45-rel37.4.el6.x86_64.rpm
# anaconda-ks.cfg
# git-2.16.3-intel-universal-mavericks.dmg
# gogs.script
# install.log
# install.log.syslog
# python.py
nothing added to commit but untracked files present (use “git add” to track)
[root@localhost ~]#
12)push到服务器
本地搭建私服,模仿GitHub
配置本地用户名和邮箱:
[root@localhost ~]# git config –global user.name “myself”
[root@localhost ~]# git config –global user.email “myself@qq.com”
[root@localhost ~]#
[root@localhost ~]# cat ~/.gitconfig
[user]
name = myself
email = myself@qq.com
关联远程版本库:
[root@localhost ~]# git remote add origin http://192.168.142.128:3000/myself/test.git
[root@localhost ~]# cat ~/.gitconfig
[user]
name = myself
email = myself@qq.com
[root@localhost ~]# cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote “origin”]
url = http://192.168.142.128:3000/myself/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
远程版本库名origin,这是一个习惯用法,将建立origin和后面的URL映射,这些信息都保存在.git/config 文件中的[remote “origin”]中。
推送数据:
[root@localhost ~]# git push -u origin master
error: The requested URL returned error: 401 Unauthorized while accessing http://192.168.142.128:3000/myself/test.git/info/refs
fatal: HTTP request failed
通讯失败解决办法:vi .git/config
里面url里面加入一个用户名。
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote “origin”]
url = http://myself@192.168.142.128:3000/myself/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch “master”]
remote = origin
merge = refs/heads/master
[root@localhost ~]# git push -u origin master
Xlib: extension “RANDR” missing on display “localhost:10.0”.
error: The requested URL returned error: 401 while accessing http://myself@192.168.142.128:3000/myself/test.git/info/refs
fatal: HTTP request failed
[root@localhost ~]# git push -u origin master
Xlib: extension “RANDR” missing on display “localhost:10.0”.
Counting objects: 16, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (16/16), 1.21 KiB, done.
Total 16 (delta 3), reused 0 (delta 0)
To http://myself@192.168.142.128:3000/myself/test.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
输入密码就能连接到远程仓库了。私有的仓库必须登录,只能用户自己看。
-u 第一次推送的时候加上,以后就不需要-u参数,可以使用git origin master或者git push就可以了。
从命令行创建一个新的仓库
touch README.md
git init
git add README.md
git commit -m “first commit”
git remote add origin http://192.168.142.128:3000/myself/test.git
git push -u origin master
从命令行推送已经创建的仓库
git remote add origin http://192.168.142.128:3000/myself/test.git
git push -u origin master
13)从远程库克隆
创建公钥和私钥
git config –global user.name “myself”
git config –global user.email “myself@qq.com”
$ cat ~/.gitconfig 查看添加的信息。
[root@localhost ~]# ssh-keygen -t rsa -C “myself”
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
56:2a:7f:69:70:38:cf:32:75:cd:c7:ad:d3:4d:22:d3 myself
The key’s randomart image is:
+–[ RSA 2048]—-+
| |
| |
| . |
| + + ..|
| . S o + E =|
| + B o o *.|
| + * o o|
| = . |
| |
+—————–+
[root@localhost ~]# ls .ssh
id_rsa id_rsa.pub
Windows 下:
git config –global user.name “myself”
git config –global user.email “myself@qq.com”
$ cat ~/.gitconfig 查看添加的信息。
WCL@Lenovo-PC MINGW64 /c (master)
$ ssh-keygen -t rsa -C “myself@qq.com”
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/WCL/.ssh/id_rsa):
Created directory ‘/c/Users/WCL/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/WCL/.ssh/id_rsa.
Your public key has been saved in /c/Users/WCL/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:95Fv6r5DOyTl8h5Bh7luOhYOZnrmxUf0RmSxRNuiNSQ myself@qq.com
The key’s randomart image is:
+—[RSA 2048]—-+
| E.B. |
| O + |
| = O .|
| o.O o |
| S .oB o |
| +o+++= |
| + ooB*.o |
| . o.++=+ |
| +…=*+ |
+—-[SHA256]—–+
WCL@Lenovo-PC MINGW64 /c (master)
$ cd ~/.ssh
WCL@Lenovo-PC MINGW64 ~/.ssh (master)
$ ls
id_rsa id_rsa.pub
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCz2m7NkCWNxnFhsqxM2yJBnyKmzJAF1tY8T2Wwnqg+5aXZfH1JC7uYncXQY+yFomCDWlSGUeC6A9Ca5bufFa/zNTwKSj/VfM7IdFQm5/l9PO+cYsT+jyDnzrnWRPE0w1E+No4YCeASlMh19ywAcjCmlAKZNBQHiyGagcb3Xdi4whoM4fMLyuK/7oCZwJyBlAKySCXO946wnNR1U60yDgn7bIAnLWasE1at39u8B4D6A7Vq7CXOAeW9h4rHLwPO1Z0Lq2F8QM2qAfbKL7Jyj3SgLnyVhi2nassPXXypVfG43voW3l/rXQcoAl9D2UIqtmVmRAHOj2rRE16nENHn9N0d myself@qq.com
在用户设置里面的ssh秘钥里面增加秘钥:
- ssh远程连接库:
git@192.168.142.128:myself/test.git
$ git clone git@192.168.142.128:myself/test.git
Cloning into ‘test’…
The authenticity of host ‘192.168.142.128 (192.168.142.128)’ can’t be established.
RSA key fingerprint is SHA256:4baHBvpJvWzXDTKFpbpih5hmcsUhExyKXJroD9PCVAU.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.142.128’ (RSA) to the list of known hosts.
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 16 (delta 3), reused 0 (delta 0)
Receiving objects: 100% (16/16), done.
Resolving deltas: 100% (3/3), done.
克隆成功
5、pycharm中使用git
Gib私服创建cmdb项目版本库。
创建一个Python的仓库:
或者ssh的地址:git@192.168.142.128:myself/cmdb.git
增加秘钥:
从版本控制工具中获取项目,选择git。
选择项目目录,填写远程版本库地址,test测试一下:
成功,并直接用pycharm打开项目。
6、项目开发
- 存储:Stash:应用场景。
命令 说明 git stash 暂存最后一次提交后的变化,放入栈中 git stash pop 从栈中取出刚才保存的变化,并合并。 利用stash暂存。
- 恢复以前的代码。
应用场景:
需要紧急中断当前的工作完成其他的工作。
开发中,当前手中的工作未完成,需要中断当前工作来完成其他请求,例如修复bug等。
已完成的工作内容提交不合适,需要大的调整,紧急请求也得做,就需要stash。存储未完成的工作。
7、分支
多人协作完成,项目中不同的独立的功能,这些功能能需要好几天才能完成,定制版本,往往需要一个不同的定制需求。
代码中,至少有一个分支,就是主干分支。
图中节点表示每一次提交。
项目往往是并行多人开发的,都在主分支上克隆,然后修改叫,那么主分支就存在大量冲突,甚至不完善的代码提交。
引入分支
分支名:
分支名在版本库中必须唯一。
不能以 – 号开头。
可以使用/,但是不能以其结尾,被他分隔的名称不能以.开头。
不能使用两个连续的..
不能包含任何空白字符,git的特殊符号。
- 创建分支
需要知名从什么分支上创建什么名字的分支。
- 分支合并:
- 目前的合并,只是本地库内的,需要push到远程库里面去。
可以继续检索到dev分支,开发完成后继续合并。
Fast Forward
8、GitFlow工作流:
不同公司,不同的项目规模,不同的管理水平都有着不同的git工作流方式。
使用git一般至少两个分支:master和develop
Master 主分支 稳定的代码。
Develop开发分支
辅助分支
Feature 分支 具体功能开发分支
Release 分支
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99565