学习的重要性:
要成為一個真正的軟體工程師(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 可以分為 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