git和github的入门学习

学习的重要性:

要成為一個真正的軟體工程師(Software Engineer)除了掌握基礎開發能力外,更重要的是和其他工程師和開發者團隊合作和溝通的能力,所以若你能培養出掌握 Git 等版本控制操作和 Git server 架設的能力,你會更容易參與開放原始碼(open source)的社群和提昇自己在職場上的價值。

前言:一般在軟體開發中又分為中央式系統(例如:Subversion、CVS 等)與分散式系統(例如:Git、BitKeeper、mercurial 等),中央式版本控制系統的工作主要在一個伺服器進行,由中央管理存取權限「鎖上」檔案庫中的檔案,一次只能讓一個開發者進行工作,而git属于分散式系统,分散式系統讓不同開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一個檔案,而每個檔案庫有另外一個合併各個改變的功能。分散式系統讓開發者能在沒有網路的情況下也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央管理者的許可,但分散式系統仍然可以有檔案上鎖功能。

官方解释:

Git 是一個分散式版本控制軟體,Github 則是一個支援 git 程式碼存取和遠端托管的平台服務,有許多的開放原始碼的專案都是使用 Github 進行程式碼的管理。

理解:git,就我个人理解,是一个进行代码记录,存储管理的工具,可以多人协作共同维护贡献一个代码仓库,需要配合gitlab或github使用(版本控制、代码托管、协作开发、基友社交)。通俗讲也就是当你对代码进行了修改,你需要现把代码进行git add,加入到缓存区,然后再git commit -m,真正保存到本地文件里,最后在git push,把修改提交到远程代码仓库(提交远程仓库需要把本地文件和远程仓库建立连接),听到这里有点迷糊,所以需要一个整体git的文件框架图,如下:

1.学习git,首先要了解git操作文件的框架图。

git和github的入门学习_第1张图片

Git 可以分為 Local(本地)和 Remote(遠端)兩個環境,由於 Git 屬於分散式的版本控制系統,所以開發者可以在離線 local 環境下開發,等到有網路時再將自己的程式推到 Remote 環境或 pull 下其他開發者程式碼進行整合。在 Local 中我們又分為 working directory(工作資料夾)、staging area(暫存區)和 repositories(檔案庫)。

當自己開發時會在工作資料夾工作,當要進入檔案庫之前會先將檔案加入暫存區,確認沒問題則 commit 到檔案庫中,最後 push 上去 remote 環境。在 Git 中若是有和其他開發者一起合作,則會需要處理不同 branch 之間 conflict 和 merge 的問題。

2.git 实操流程命令

// 建立一個 hello-git 資料夾
$ mkdir hello-git
// 移動到 hello-git 資料夾
$ cd hello-git
// 將專案資料夾建立成 git repository
$ git init
// 列出專案資料夾下的檔案和資料夾(-l 參數為列出詳細資料,-a 為列出隱藏資料夾)
$ ls -la

建立hello.py文件

echo “print('hello git')” > hello.py

$ git status
On branch master

Initial commit

Untracked files:
(use "git add ..." to include in what will be committed)

    hello.py

nothing added to commit but untracked files present (use "git add" to track)
$ git add hello.py
$ git status
On branch master

Initial commit

Changes to be committed:
(use "git rm --cached ..." to unstage)

    new file:   hello.py
// 比較現在檔案和上次 commit 之間的差異,也就是說你做了哪些修改
$ git diff
// -m 為輸入 commit message,也就是說這個 commit 內做了哪些事情
$ git commit -m "Init hello.py"
[master (root-commit) ad6d328] Init hello.py
1 file changed, 1 insertion(+)
create mode 100644 hello.py

// commmit 完成
$ git status
On branch master
nothing to commit, working tree clean
// 比較現在檔案和上次 commit 之間的差異,也就是說你做了哪些修改
$ git diff
// 查看目前工作狀態
$ git status
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)

    modified:   hello.py
git commit -a -m "修改了 hello.py"

git diff命令用于显示提交和工作树等之间的更改。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。

3.git 与github之间建立连接

$ git config --global user.username <你的 github 使用者名稱>
git remote add origin 
$ git status
// 將本地端程式 push 到遠端檔案庫
$ git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 239 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/happycodergit/git-example.git
* [new branch]      master -> master
Branch master set up to track remote branch master from origin.

參數 -u 等同於 --set-upstream,設定 upstream 可以使分支開始追蹤指定的遠端分支。事實上,只要做過一次 $ git push -u ,並且成功 push 出去;本機端的 master 就會被設定去追蹤遠端的 / 分支。只要成功設定好 upstream 後,第二次以後要上傳分支時,就只需要透過 git push 就可以了,不必再帶 等參數。例如:$ git push

 

常用命令总结:

apt-install git

git config --global user.name ""
git config --global user.email ""

git init

git add

git commit -m

git commit -a -m

git remote add origin http:/.....

git push origin [brach:master/.../]

git push -u origin [branch] 绑定

git push

git checkout -b newbrach

git branch -d

git branch [newbranch]

git branch

git merge [branch]

git push origin --delete [branch]

git pull upstream master 向开源库贡献代码,但是要向它发起 new pull requst,同意之后才能执行这命令,这里的upstream可以理解为上游或者父类 
參數 -u 等同於 --set-upstream

forck谁的github谁就是upstream,这样就绑定了起来

git 同步fork:

从上游仓库 fetch 分支和提交点,提交给本地 master,并会被存储在一个本地分支 upstream/master

git fetch upstream

切换到本地主分支(如果不在的话)

git checkout master

把 upstream/master 分支合并到本地 master 上,这样就完成了同步,并且不会丢掉本地修改的内容。

git merge upstream/master

如果想更新到 GitHub 的 fork 上,直接 

git push origin master

 

git免密操作:(1)在github 或者gitlab里面 setting里面加入本地ssh公钥,

(2)然后记得git clone的时候用ssh key

 

如果是通过http获取的github,需要添加一个命令:git remote set-url origin [email protected]:username/reposition.git

你可能感兴趣的:(linux,git,github)