git/github使用完整教程(1)基礎

安裝git

在Linux上安裝Git

首先輸入git,看看系統有沒有安裝Git:

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

像上面的命令,有很多Linux會友好地告訴你Git沒有安裝,還會告訴你如何安裝Git。

如果是其他Linux版本,可以直接通過源碼安裝。先從Git官網下載源碼,然后解壓,依次輸入:./configmakesudo make install這幾個命令安裝就好了。

在Windows上使用Git,可以從Git官網直接下載安裝程序,然后按默認選項安裝即可。

安裝完成后,在開始菜單里找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西,就說明Git安裝成功!

安裝完成后,還需要最后一步設置,在命令行輸入:

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

創建庫

版本庫又名倉庫,你可以簡單理解成一個目錄,這個目錄里面所有文件都可以被Git管理,每個文件修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史。所以,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄:

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

pwd命令用于顯示當前目錄。

?如果你使用Windows系統,為了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。

第二步,通過git init命令把這個目錄變成Git可以管理的倉庫:

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

瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository)。

修改兩步走

編寫一個readme.txt文件,內容如下:

Git is a version control system.
Git is free software.

第一步,用命令git add告訴Git,把文件添加到倉庫:

$ git add readme.txt

第二步,用命令git commit告訴Git,把文件提交到倉庫:

$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file1 file changed, 2 insertions(+)create mode 100644 readme.txt

-m后面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動記錄。

查看狀態

修改readme.txt文件,改成如下內容:

Git is a distributed version control system.
Git is free software.

運行git status命令看看結果:

$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified:   readme.txt
no changes added to commit (use "git add" and/or "git commit -a")

git status可以讓我們掌握倉庫當前的狀態,上面的命令輸出告訴我們,readme.txt被修改過了,但還沒有準備提交的修改。

Git會告訴你,git checkout -- file可以丟棄工作區的修改:

$ git checkout -- readme.txt

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷,這里有兩種情況:

一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;

一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。

總之,就是讓這個文件回到最近一次git commitgit add時的狀態。

具體修改了什么內容需要用git diff這個命令:

$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.Git is free software.

git diff顧名思義就是查看difference,可以從上面的命令輸出看到,我們在第一行添加了一個distributed單詞。

?

知道了對readme.txt作了什么修改后,再把它提交到倉庫,是一樣的兩步,第一步是git add

$ git add readme.txt

我們再運行git status看看當前倉庫的狀態:

$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified:   readme.txt

git status告訴我們,將要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

$ git commit -m "add distributed"
[master e475afc] add distributed1 file changed, 1 insertion(+), 1 deletion(-)

提交后,我們再用git status命令看看倉庫的當前狀態:

$ git status
On branch master
nothing to commit, working tree clean

Git告訴我們當前沒有需要提交的修改,而且,工作目錄是干凈(working tree clean)的。

版本

版本控制系統有命令可以告訴我們歷史記錄,在Git中,我們用git log命令查看:

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:06:15 2018 +0800append GPLcommit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800add distributedcommit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800wrote a readme file

git log命令顯示從最近到最遠的提交日志,我們可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file

如何回退?

在Git中,用HEAD表示當前版本,,上一個版本就是HEAD^,上上一個版本就是HEAD^^,往上100個版本可以寫成HEAD~100

現在,我們要把當前版本append GPL回退到上一個版本add distributed,就可以使用git reset命令:

$ git reset --hard HEAD^
HEAD is now at e475afc add distributed

要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。?

github SSH keys

實際情況往往是這樣,找一臺電腦充當服務器的角色,每天24小時開機,其他每個人都從這個“服務器”倉庫克隆一份到自己的電腦上,并且各自把各自的提交推送到服務器倉庫里,也從服務器倉庫中拉取別人的提交。

完全可以自己搭建一臺運行Git的服務器,不過現階段,只要注冊一個GitHub賬號,就可以免費獲得Git遠程倉庫。

由于你的本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的,所以,需要一點設置:

第1步:創建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsaid_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:

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

你需要把郵件地址換成你自己的郵件地址,然后一路回車,使用默認值即可。

如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

第2步:登陸GitHub,打開“Account settings”,“SSH Keys”頁面:

然后,點“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內容:

為什么GitHub需要SSH Key呢?GitHub需要識別出提交確實是你推送的,而不是冒充的,而Git支持SSH協議。當然,GitHub允許你添加多個Key。假定你有若干電腦,只要把每臺電腦的Key都添加到GitHub,就可以在每臺電腦上往GitHub推送了。

和github關聯

創建一個新的倉庫:

目前,在GitHub上的這個learngit倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然后,把本地倉庫的內容推送到GitHub倉庫。

現在,我們根據GitHub的提示,在本地的learngit倉庫下運行命令:

$ git remote add origin git@github.com:yourname/learngit.git

添加后,遠程庫的名字就是origin,這是Git默認的叫法,也可以改成別的,但是origin這個名字一看就知道是遠程庫。

下一步,就可以把本地庫的所有內容推送到遠程庫上:

$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git* [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。

由于遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或者拉取時就可以簡化命令。

$ git push origin master

把本地master分支的最新修改推送至GitHub,現在,你就擁有了真正的分布式版本庫!

clone

用命令git clone克隆一個github庫到本地:

$ git clone git@github.com:yourname/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.

如果有多個人協作開發,那么每個人各自從遠程克隆一份就可以了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444064.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

git/github使用完整教程(2)分支

分支 首先&#xff0c;我們創建dev分支&#xff0c;然后切換到dev分支&#xff1a; $ git checkout -b dev Switched to a new branch devgit checkout命令加上-b參數表示創建并切換&#xff0c;相當于以下兩條命令&#xff1a; $ git branch dev $ git checkout dev Switch…

數組【數據結構】

前提 數組的定義以及數組的延伸 這種不好進行理解&#xff0c;那么我們下面以二維數組進行解釋 多維數組的數據特點 存儲數組結構的兩種方式 問題抽象總結

Kafka深度解析

原創文章&#xff0c;轉載請務必將下面這段話置于文章開頭處&#xff08;保留超鏈接&#xff09;。 本文轉發自技術世界&#xff0c;原文鏈接 http://www.jasongj.com/2015/01/02/Kafka深度解析 背景介紹 Kafka簡介 Kafka是一種分布式的&#xff0c;基于發布/訂閱的消息系統。…

數據的存儲特殊矩陣壓縮存儲【數據結構F】

以行為主序 以列為主序 矩陣的前提分類 三角矩陣

C++ 多態和虛函數

虛函數實現多態 #include <iostream> using namespace std;//基類People class People{ public:virtual void display(); //聲明為虛函數 }; void People::display(){cout<<"無業游民。"<<endl; }//派生類Teacher class Teacher: public People{…

圖的基本概念【數據結構】

序言 1對1的線性結構&#xff0c;一對多的樹二叉樹以及森林&#xff0c;第3種就是多對多的結構&#xff0c;也就是我們所要講到的圖的結構&#xff0c;圖形結構是數據結構當中最復雜的一種結構&#xff0c;圖形結構的特點就是在這個圖當中任意兩點之間都會有關系&#xff0c;這…

go語言一天入門(上)

第一個go程序 package mainimport "fmt"func main() {/* 這是我的第一個簡單的程序 */fmt.Println("Hello, World!") } 第一行代碼 package main 定義了包名。你必須在源文件中非注釋的第一行指明這個文件屬于哪個包&#xff0c;如&#xff1a;package m…

Jquery 全選,反選

<script src"../js/jquery-1.6.2.min.js" type"text/javascript"></script><script language"javascript" type"text/javascript">$(function(){$("#selectAll").click(function(){//全選$("#playLi…

go語言一天入門(下)

結構體 和c一樣 package mainimport "fmt"type Books struct {title stringauthor stringsubject stringbook_id int }func main() {// 創建一個新的結構體fmt.Println(Books{"Go 語言", "www.runoob.com", "Go 語言教程", 6495407}…

圖的遍歷算法【數據結構F】

圖的遍歷算法有哪兩種&#xff1f; 深度優先調度算法---------將圖結構看成是樹形結構&#xff0c;樹形結構的子圖直接是沒有交叉的&#xff0c;但是對于圖結構的樹形結構之間是有交叉的&#xff0c;類比于樹形結構的二叉樹&#xff0c;左指數和右指數都會相應的經歷三次&#…

go語言快速刷《程序員面試金典》(1)

實現一個算法&#xff0c;確定一個字符串 s 的所有字符是否全都不同。 一個數組統計是否有 func isUnique(astr string) bool {var arr[26] int;for _,ch:range astr{num:ch-aif(arr[num]1){return false}arr[num]}return true } 給定兩個字符串 s1 和 s2&#xff0c;請編寫一…

最小生成樹【數據結構】

前提 【1】網的最小生成樹&#xff0c;涉及到生成樹了那么就會有最小的權值在里面了 【2】對于一個圖來說生成樹是由多個的&#xff0c;并不是唯一的 【3】&#xff1a;廣度優先算法的遍歷是可以得到生成樹的&#xff0c;深度優先算法也是可以得到生成樹的 任意的一個聯通網&am…

go語言快速刷《程序員面試金典》(2)

字符串輪轉。給定兩個字符串s1和s2&#xff0c;請編寫代碼檢查s2是否為s1旋轉而成&#xff08;比如&#xff0c;waterbottle是erbottlewat旋轉后的字符串&#xff09;。 示例1 輸入&#xff1a;s1 "waterbottle", s2 "erbottlewat" 輸出&#xff1a;T…

廣義表的基本概念【數據結構】

實名廣義表與匿名廣義表的區別&#xff1a;對于匿名的廣義表的表示方法我們認為一對括號就是一個廣義表&#xff0c;里面的數據可以是廣義表也可以是 原子&#xff0c;對于有名字的廣義表&#xff0c;也就是大寫的字母我們可以直接認為大寫的就是廣義表的表示方法小練習----廣義…

go語言快速刷《程序員面試金典》(3)

編寫程序以 x 為基準分割鏈表&#xff0c;使得所有小于 x 的節點排在大于或等于 x 的節點之前。如果鏈表中包含 x&#xff0c;x 只需出現在小于 x 的元素之后(如下所示)。分割元素 x 只需處于“右半部分”即可&#xff0c;其不需要被置于左右兩部分之間。 示例: 輸入: head …

樹和二叉樹【數據結構】

基本概念 ADT的定義 基本操作 對比樹形結構和線性結構 基本術語以及注意事項-不能錯誤簡單的我以為 二叉樹是度數小于等于2的樹&#xff0c;而不是度為2的樹&#xff0c;一定要記住這個概念 小知識&#xff1a;二進制轉換成為十進制的方法名稱叫做位權求和法&#xff0c;用到…

leetcode557. 反轉字符串中的單詞 III python,處理字符串的神!

給定一個字符串&#xff0c;你需要反轉字符串中每個單詞的字符順序&#xff0c;同時仍保留空格和單詞的初始順序。 示例 1: 輸入: "Lets take LeetCode contest" 輸出: "steL ekat edoCteeL tsetnoc" 注意&#xff1a;在字符串中&#xff0c;每個單詞由…

數據庫2.1.1mysql的特點

在mysql5.1當中&#xff0c;mysqlab公司引入了新的插件式存儲引擎體系結構&#xff0c;也許將存儲引擎加載到正在運行的mysql服務器當中&#xff0c;使用mysql插件是存儲引擎體系結構允許數據庫用戶為特定的應用需求選擇專門的存儲引擎&#xff0c;完全不需要管理任何特殊的應用…

leetcode369. 給單鏈表加一

用一個 非空 單鏈表來表示一個非負整數&#xff0c;然后將這個整數加一。 你可以假設這個整數除了 0 本身&#xff0c;沒有任何前導的 0。 這個整數的各個數位按照 高位在鏈表頭部、低位在鏈表尾部 的順序排列。 示例: 輸入: [1,2,3] 輸出: [1,2,4] 思路&#xff1a; hel…

MySQL常見的兩種存儲引擎:MyISAM與InnoDB的愛恨情仇

一 MyISAM 1.1 MyISAM簡介 MyISAM是MySQL的默認數據庫引擎&#xff08;5.5版之前&#xff09;&#xff0c;由早期的 ISAM &#xff08;Indexed Sequential Access Method&#xff1a;有索引的順序訪問方法&#xff09;所改良。雖然性能極佳&#xff0c;而且提供了大量的特性&a…