Git从入门到精通

本文介绍了Git作为开源的分布式版本控制系统的基础知识,包括如何设置用户签名、初始化本地库、查看和管理文件状态、提交更改、使用暂存区、查看提交日志、进行版本穿梭。此外,还详细讲解了分支的概念和操作,如创建、切换、删除和合并分支,以及处理合并冲突的方法。最后,文章涵盖了远程库的操作,如添加远程别名、推送、拉取和克隆仓库。
摘要由CSDN通过智能技术生成

Git入门

1.简介

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

官网: Git - Downloads (git-scm.com)

2.安装

3.常用命令

设置用户签名

没有设置用户签名无法提交和克隆代码

git config --global user.name 用户名
git config --global user.email 邮箱

初始化本地库

语法:git init

初始化后,当前目录会生成一个.git隐藏文件夹

19407@test-com MINGW64 /e/GitSpase/git-test
$ git init
Initialized empty Git repository in E:/GitSpase/git-test/.git/

19407@test-com MINGW64 /e/GitSpase/git-test (master)

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ ls -lha
total 4.0K
drwxr-xr-x 1 19407 197609 0 Feb 28 22:32 ./
drwxr-xr-x 1 19407 197609 0 Feb 28 22:32 ../
drwxr-xr-x 1 19407 197609 0 Feb 28 22:32 .git/

查看本地库状态

查看仓库当前的状态,显示有变更的文件。

语法:git status

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

有文件变更

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hellogit.txt

nothing added to commit but untracked files present (use "git add" to track)

有文件添加到暂存区

$git add hellogit.txt

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hellogit.txt

提交到本地库

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git commit -m "first commit" hellogit.txt
[master (root-commit) 986145a] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hellogit.txt

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
nothing to commit, working tree clean

添加文件到暂存区

语法:git add 文件名

$git add hellogit.txt

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hellogit.txt

从暂存区移除

语法:git rm --cached 文件名

$ git rm --cached hello.txt
rm 'hello.txt'

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

提交到本地库

语法:git commit -m "日志信息" 文件名

$ git commit -m "first commit hello.txt" hello.txt
[master 2adb22d] first commit hello.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
nothing to commit, working tree clean

查看日志

语法:git reflog

$ git reflog
2adb22d (HEAD -> master) HEAD@{0}: commit: first commit hello.txt
986145a HEAD@{1}: commit (initial): first commit

查看详细日志

语法:git log

$ git log
commit 2adb22d3bac5e674cc2704d06a37e1934b3c274f (HEAD -> master)
Author: xxxxx <xxxxxx@qq.com>
Date:   Tue Feb 28 23:23:40 2023 +0800

    first commit hello.txt

commit 986145a324c080df679732067de67c6638ff3649
Author: xxxxx <xxxxxx@qq.com>
Date:   Tue Feb 28 23:15:31 2023 +0800

    first commit

版本穿梭

语法:git reset --hard 版本号

$ git reflog
ba4516b (HEAD -> master) HEAD@{0}: commit: second commit #当前版本
8b45283 HEAD@{1}: commit (initial): first commit

## 切换到第一次提交的版本
19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git reset --hard 8b45283
HEAD is now at 8b45283 first commit

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ vim test.txt

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git reflog
8b45283 (HEAD -> master) HEAD@{0}: reset: moving to 8b45283
ba4516b HEAD@{1}: commit: second commit #之前版本
8b45283 (HEAD -> master) HEAD@{2}: commit (initial): first commit #现在版本

4.git分支操作

几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。对于初学者而言,分支可以理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

查看当前分支

语法:git branch [-v]

  • -v可以查看本版号和提交日志
$ git branch -v
* master 8b45283 first commit

$ git branch
  hot-fix
* master

创建分支

语法:git branch 分支名

$ git branch hot-fix

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git branch -v
  hot-fix 8b45283 first commit
* master  8b45283 first commit

切换分支

语法:git checkout 分支名

$ git branch -v
  hot-fix 8b45283 first commit
* master  8b45283 first commit

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'

19407@test-com MINGW64 /e/GitSpase/git-test (hot-fix)
$ git branch -v
* hot-fix 8b45283 first commit
  master  8b45283 first commit

删除分支

语法:git branch -d 分支名

$ git branch -d hot-fix
Deleted branch hot-fix (was 8b45283).

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git branch
* master

合并分支

语法:git merge 分支名

正常合并

19407@test-com MINGW64 /e/GitSpase/git-test (hot-fix)
$ git checkout master
Switched to branch 'master'

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ cat test.txt
master first

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git merge hot-fix
Updating 9b74a53..852ce1e
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ cat test.txt
master first
hot-fix first

合并冲突

原因: 合并分支行时,两个分支在同一个文件的同一个位置有两套不同的修改,git无法决定使用哪个修改

master|MERGING表示当前正在合并,但无法合并

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git merge hot-fix
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

19407@test-com MINGW64 /e/GitSpase/git-test (master|MERGING)
$ cat test.txt
master first
hot-fix first
<<<<<<< HEAD
master second
=======
hot-fix second
>>>>>>> hot-fix
19407@test-com MINGW64 /e/GitSpase/git-test (master|MERGING)

#当前本地库状态
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   test.txt     

此时需要手动处理冲突

master first
hot-fix first
<<<<<<< HEAD
master second
=======
hot-fix second
>>>>>>> hot-fix

# 处理要处理的代码
master first
hot-fix first
master second
hot-fix second

添加到暂存区

$ git add test.txt

19407@test-com MINGW64 /e/GitSpase/git-test (master|MERGING)
$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
        modified:   test.txt

执行提交(此时使用commit不能带文件名)

$ git commit -m "merge test"
[master 6a5732c] merge test

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git status
On branch master
nothing to commit, working tree clean

5.远程库操作

远程库别名

可以将远程库地址设置别名,方便使用

语法:git remote -v查看当前所有远程地址别名

git remote add 别名 远程地址 添加远程库别名

$ git remote add git-test https://gitee.com/YananK/git-test.git

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git remote -v
git-test        https://gitee.com/YananK/git-test.git (fetch)
git-test        https://gitee.com/YananK/git-test.git (push)

推送到远程库

语法:git push 别名/地址 分支

$ git remote -v
git-demo        git@github.com:ZnShiJie/git-demo.git (fetch)
git-demo        git@github.com:ZnShiJie/git-demo.git (push)

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git push git-demo master
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (15/15), 1.13 KiB | 384.00 KiB/s, done.
Total 15 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), done.
To github.com:ZnShiJie/git-demo.git
 * [new branch]      master -> master

拉取到本地库

语法: git pull 别名/地址 分支名

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ git pull git-demo master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 682 bytes | 45.00 KiB/s, done.
From github.com:ZnShiJie/git-demo
 * branch            master     -> FETCH_HEAD
   6a5732c..f22f778  master     -> git-demo/master
Updating 6a5732c..f22f778
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)

19407@test-com MINGW64 /e/GitSpase/git-test (master)
$ cat test.txt
master first
hot-fix first
master second
hot-fix second
在github上修改了

克隆到本地仓库

语法:git clone 远程地址

19407@test-com MINGW64 /e/GitSpase
$ git clone https://github.com/ZnShiJie/git-demo.git
Cloning into 'git-demo'...
fatal: unable to access 'https://github.com/ZnShiJie/git-demo.git/': OpenSSL SSL_read: Connection was reset, errno 10054

19407@test-com MINGW64 /e/GitSpase
$ git clone https://github.com/ZnShiJie/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 18 (delta 2), reused 14 (delta 1), pack-reused 0
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (2/2), done.

19407@test-com MINGW64 /e/GitSpase
$ cd git-demo/

github由于服务器问题,可能会出现克隆失败

fatal: unable to access ‘https://github.com/ZnShiJie/git-demo.git/’: OpenSSL SSL_read: Connection was reset, errno 10054

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值